IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Redessiner le bon endroit


Sujet :

SDL

  1. #1
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut Redessiner le bon endroit
    Bonjour,
    C'est avec une question toute simple que je vien vous trouver. Simple à expliquer mais dont la réponsse est quelque peut délicate.
    Je souaite en effet ne redessiner que la partie de l'image qui en a besoin.
    J'ai choisi d'encapsuler la SDL et de créer un objet par surface à bliter, qui dispose d'une fonction Blit avec pour paramêtre l'écran et la zone de l'écran à dessiner (RedrawZone). J'ai aussi un SDL_Rect pour définir la partie de ma surface à bliter que je doit découper (_selectZone) ainssi qu'un SDL_Rect corespondant à l'endroit ou se situ ma partie découper (_blitZone)

    Je doit tout simplement génèrer deu SDL_Rect : Un corespondant à la jonction de RedrawZone et _drawZone, l'autre corespondant à la partie de mon image qui devras être selectioner pour entrer dans ce carée.

    Seulement je ne voit pas trop comment faire ca sans enchainer un paquet de if imbriquer... :s

    (Pour mieu comprendre, des petits shéma


    Edit : A la limite ca n'est pas réserver qu'à SDL, c'est un problème qui peut être rencontrer dans des cas similaire avec d'autres librairies.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Sans chercher loin, je crois que le SDL_Rect que tu veux est donné par ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /* Le coin supérieur gauche est donne par le minimum des deux coordonnees */
    RedrawZone.x = (_drawZone.x < _selectZone.x)? _drawZone.x:_selectZone.x;
    RedrawZone.y = (_drawZone.y < _selectZone.y)? _drawZone.y:_selectZone.y;
     
    /* Calcul du coin inferieur droit des deux rectangles */
    dzx = _drawZone.x + _drawZone.w;
    dzy = _drawZone.y + _drawZone.h;
    szx = _selectZone.x + _selectZone.w;
    szy = _selectZone.y + _selectZone.h;
     
    /* Variables locales du coin superieur gauche de l'intersection */
    rdx = RedrawZone.x;
    rdy = RedrawZone.y;
     
    /* Le coin inferieur droit est le max des deux coordonnees */
    RedrawZone.w = (dzx>szx)?dzx-rdx:szx-rdx;
    RedrawZone.h = (dzy>szy)?dzy-rdy:szy-rdy;
    On sait qu'on a une intersection si la largeur et la hauteur de l'intersection sont >0.

    Mais il se peut que je me trompe.
    Jc

  3. #3
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par fearyourself
    Mais il se peut que je me trompe.
    Jc
    Oui ^^ _selectZone corespond au rectangle de l'image dont je découpe une partie. Donc par exmeple selct zone pourait être un rectangle définissant un personage dans un fichier de sprite.

    Il me faut donc calculer deux rectangles.

    En plus, il y à un cas ou il n'y à pas de zone de jonction.

    Aparement tout ce que tu calcule est juste. Il reste donc maintenant à realculer un nouveau découpage du sprite pour le loger dans cette zone de retracage ^^'
    (Ca je vias pouvoir me débroiller)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ok, en effet, je me suis trompé, mais je ne comprends pas quelques détails :

    - T'entends quoi par jonction ? C'est une union, une intersection, un mélange entre deux rectangles ?

    - Donne une meilleur définition de tes SDL_Rect qui rentre en jeu et si tu pouvais donner dans ton image les rectangles associé (mettre _selectZone dans l'image par exemple, pour qu'on voit bien ce que tu veux)

    - Que connais tu exactement, de quoi t'as besoin :
    - On dirait que tu as la zone choisi dans ton image de base
    - Tu connais la destination de cette image
    - Tu connais la zone qu'il faut redessiner
    Donc il te faut la destination sur l'ecran et la source de l'image, c'est ca ?

    Jc

  5. #5
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par fearyourself
    Donc il te faut la destination sur l'ecran et la source de l'image, c'est ca ?
    Donc, je pensse à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		//Calcule du rectangle de selection
    		SDL_Rect SelectZone;
    		//Conservation de la distance Blit-DrawZone
    		SelectZone.x = (DrawZone.x - _blitZone.x) + _selectZone.x;
    		SelectZone.y = (DrawZone.y - _blitZone.y) + _selectZone.y;
    		//Reduction du décalage
    		SelectZone.w = _selectZone.w - (DrawZone.x - _blitZone.x);
    		SelectZone.h = _selectZone.h - (DrawZone.x - _blitZone.x);
    De toute fasson je finirait bien par m'en rendre compte si c'est incorecte. mais je trouve quand même tous ces calcules lourd, sachan que j'ai voulut instaurait ce découpage pour accèlèrer l'afichage (Dernière fois j'ai fini avec un fps autour de 2 ~ 3 )

    Edit : le cas sans intersection corespond à des longueurs/largeurs négativent.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par JC_Master
    Exacte, et grace à toi j'ai déjà la destination. Pour la source je tente de trouver et j'édite dans 10Minutes
    Ok, donc pour la source, il faut faire ceci :

    Si _drawZone est la destination pour l'image et RedrawZone la destination que je viens de calculer (donc ta partie violette).

    Enfin si blitZone est le rectangle source,
    Alors il suffit de faire ceci pour calculer blitZone :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* On veut la position source... Elle a la même largeur/hauteur que RedrawZone, par contre son coin supérieur gauche doit passer d'absolu à relatif */
    blitZone.x = RedrawZone.x - _drawZone.x;
    blitZone.y = RedrawZone.y - _drawZone.y;
    blitZone.w = RedrawZone.w;
    blitZone.h = RedrawZone.h;
    Mais je crois que j'ai mélangé tous tes noms...


    Edit : le cas sans intersection corespond à des longueurs/largeurs négativent.
    Je l'avais déjà dit :
    On sait qu'on a une intersection si la largeur et la hauteur de l'intersection sont >0.


    Jc

  7. #7
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Heu il me semble que tu oubli de tenir compte du réctangle source défini pour le cas ou il faut tout redessiner (pemier afichage par exemple). Et sinon oui tu t'est mélanger els noms mais c'est pas grave ^^'
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par JC_Master
    Heu il me semble que tu oubli de tenir compte du réctangle source défini pour le cas ou il faut tout redessiner (pemier afichage par exemple). Et sinon oui tu t'est mélanger els noms mais c'est pas grave ^^'
    Non parce que dans le cas où il faudrait tout afficher, la destination (x,y) serait égale à la source voulue et la largeur/hauteur aussi.

    Donc le calcul est toujours bon à mon avis (à part les noms),
    Jc

  9. #9
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Je m'apuis sur les shéma :
    Il faut suprimer la distance Bleu-Maron de la coordonée violette, pour ensuite ajouter la distance Vert-Noire à ce resultat.
    Ensuite il ne faut pas prendre une largeur et une hoteur trop grande. Et oui, si la zone de selection n'était pas égale à la zone d'aplication?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    En reprenant ton image et tentant de comprendre les noms que tu voulais donner cela me donne l'image jointe.

    Il reste à calculer RedrawZone qui sera le carré à vraiment redessiner, et modifier blitZone pour prendre que ce qu'il faut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /* Le coin supérieur gauche est donne par le maximum des deux coordonnees */
    RedrawZone.x = (_drawZone.x > _blitZone.x)? _drawZone.x:_blitZone.x;
    RedrawZone.y = (_drawZone.y > _blitZone.y)? _drawZone.y:_blitZone.y;
     
    /* Calcul du coin inferieur droit des deux rectangles */
    dzx = _drawZone.x + _drawZone.w;
    dzy = _drawZone.y + _drawZone.h;
    szx = _blitZone.x + _blitZone.w;
    szy = _blitZone.y + _blitZone.h;
     
    /* Variables locales du coin superieur gauche de l'intersection */
    rdx = RedrawZone.x;
    rdy = RedrawZone.y;
     
    /* Le coin inferieur droit est le min des deux coordonnees */
    RedrawZone.w = (dzx>szx)?szx-rdx:dzx-rdx;
    RedrawZone.h = (dzy>szy)?szy-rdy:dzy-rdy;
    Ceci me donne le carré de destination si w,h > 0 sinon il n'y a pas d'intersection.


    Que supposons-nous ?

    1) Que la largeur de blitzone est la même que selectzone, ce ne serait pas logique autrement.

    Ensuite, que savons nous ?

    1) La largeur/hauteur de l'image à dessiner (donc de RedrawZone) est forcément plus petit que la largeur de _blitzone de base.
    2) Si on a quelque chose a dessiner, faut recalculer la selection, donc _selectZone.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* On veut la position source... Elle a la même largeur/hauteur que RedrawZone, par contre son coin supérieur gauche doit passer d'absolu à relatif */
    selectZone.x = - _blitZone.x + RedrawZone.x;
    selectZone.y =  - _blitZone.y + RedrawZone.y;
    selectZone.w = RedrawZone.w;
    selectZone.h = RedrawZone.h;
    En effet, on sait qu'avec ceci, selectZone ne peut pas sortir du sprite de base, sinon blitZone sortirait du sprite déjà.

    Je pense que cette fois-ci c'est bon, mais j'ai toujours comme un doute...
    Images attachées Images attachées  

  11. #11
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par fearyourself
    Que supposons-nous ?

    1) Que la largeur de blitzone est la même que selectzone, ce ne serait pas logique autrement.
    Juste non ces longuers peuvent très bien ne pas être egale. Rine ne force le rectangle de selection d'avoir la même longueur/largr que le rectangle de blit...

    Donc, mon code précédament poster tien compte de cette possibilitée... (Du moin de ce que j'ai esseiller il fonctione)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par JC_Master
    Juste non ces longuers peuvent très bien ne pas être egale. Rine ne force le rectangle de selection d'avoir la même longueur/largr que le rectangle de blit...
    Je ne comprend pas comment les tailles peuvent être différentes. Que ferais-tu si le rectangle de blit est plus grand que la taille de sélection ? Et l'inverse ?


    Jc

  13. #13
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ca c'est pas moi qui m'en charge, mais la fonction de blit de la SDL :o
    Mais dan le cas d'un sprite dont la taille peut être variable, apliquer sur un cadrige fixe, il peut y avoir une zone de selection plus faible que la zone d'afichage (La fonction de blit de la SDL ne modifira pas la zone ou il n'y à rien à aficher)

    Et puis, rien ne garanti que je serait le seul à utiliser ces sources, et que quelquin n'auras pas une idée farfelu d'utiliser des longueurs/largeurs diférentes?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par JC_Master
    Ca c'est pas moi qui m'en charge, mais la fonction de blit de la SDL :o
    Mais dan le cas d'un sprite dont la taille peut être variable, apliquer sur un cadrige fixe, il peut y avoir une zone de selection plus faible que la zone d'afichage (La fonction de blit de la SDL ne modifira pas la zone ou il n'y à rien à aficher)

    Et puis, rien ne garanti que je serait le seul à utiliser ces sources, et que quelquin n'auras pas une idée farfelu d'utiliser des longueurs/largeurs diférentes?
    Ok alors réglons le problème en faisant un travail supplémentaire avant le gros calcul :

    - Si les tailles de _selectZone et _blitZone sont différentes, alors on modifie le plus grand des deux pour qu'il soit de la taille du plus petit.

    Comme cela ils sont de la même taille.

    Une autre solution serait de faire un zoom pour faire coller la selection sur les dimension du blit mais en SDL pur, cela fera ramer ton programme.

    Jc

    PS: Encore une fois, définit clairement ce que tu veux faire lorsque les tailles sont différentes car de base, cela n'a pas vraiment de sens sauf accepter les zoom.

  15. #15
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ce que j'ai coder et citer plus haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		//Calcule du rectangle de selection
    		SDL_Rect SelectZone;
    		//Conservation de la distance Blit-DrawZone
    		SelectZone.x = (DrawZone.x - _blitZone.x) + _selectZone.x;
    		SelectZone.y = (DrawZone.y - _blitZone.y) + _selectZone.y;
    		//Reduction du décalage
    		SelectZone.w = _selectZone.w - (DrawZone.x - _blitZone.x);
    		SelectZone.h = _selectZone.h - (DrawZone.x - _blitZone.x);
    Je ne veut pas faire un zome mais simplement découper ce qui est de trop.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. mettre le pied_page au bon endroit
    Par kenny49 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 13/07/2006, 14h35
  2. Mettre le focus() au bon endroit... dans un tableau
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/05/2006, 20h18
  3. [C#] Se replacer au bon endroit d'un form après PostBack
    Par gael.mases dans le forum ASP.NET
    Réponses: 3
    Dernier message: 16/11/2005, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo