#1 

20-11-2008 11:55:08

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 90.43.108.226
Courriel

Salut

J'utilise une interface personnalisé (des images en PNG) que je charge dans une GUIIMAGE
J'aimerais déplacer une GUIImage (une fenetre) avec la souris
donc je récupère les coordonnées de la souris:

ICursorControl* _curseur= _device->getCursorControl  ()  ; // on crée un curseur
position2d<s32> _curseurPosition=_curseur->getPosition ();  // on récup la position du curseur

plus loin dans le code j'appelle une fonction qui s'appelle Deplacement (qui sert a déplacer ma fenetre

  _guiElement->move(position2d< s32 >(_curseurPosition.X,_curseurPosition.Y ));

Il déplace bien ma fenetre mais il l'avoi a des coordonnée de ouf du style x:1546598 et y:4547875878787 lol

voila quoi !

++


Hors ligne


#2 

20-11-2008 12:34:25

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.5
Courriel

je croi que c'est un probleme de conversion


Hors ligne


#3 

20-11-2008 12:53:15

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 90.43.108.226
Courriel

c'est a dire ?

tu parle de coordonnées relatives et coordonnée absolue ?


Hors ligne


#4 

20-11-2008 15:56:09

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.5
Courriel

je pense car si tu sort de l'ecran tu obtien -0....


Hors ligne


#5 

20-11-2008 15:57:13

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.5
Courriel

sinon dans les esample dans la demo 2d graphiqs il montre comment bouger une image avec draw2dImage()


Hors ligne


#6 

20-11-2008 16:08:33

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 90.43.108.226
Courriel

sinon dans les esample dans la demo 2d graphiqs il montre comment bouger une image avec draw2dImage()

oui mais le prob c que mon image est une GUIELEMENT donc je ne peut pas faire appel a cette méthode.

en fait je pense que la méthode virtual void irr::gui::IGUIElement::move ( core::position2d< s32 > absoluteMovement ) [inline, virtual]
fait bouger la GUIELEMEnt en incrémentant la valeur asboluteMOVEMENt ce qui peut expliquer pourquoi j'ai des coordonnée astronomique.

Que faire ?


Hors ligne


#7 

20-11-2008 17:23:46

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.5
Courriel

un truc du genre
==============
si curpos et inférieur a elementpos alors final pos = elementpos - (elementpos - position2d<s32>(-curposX, -curPosY)));
==============
si supérieur
finalpos = curpos -elementpos;


Hors ligne


#8 

21-11-2008 08:02:57

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.5
Courriel

sa a résolue ton problème ?


Hors ligne


#9 

21-11-2008 09:15:29

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 90.43.83.148
Courriel

Merci de ton aide ce que tu dit est juste mais mon prob ne ce situé pas a ce niveau la. J'explique:

la méthode move que j'utilisais n'étais pas bonne car move fait bouger constamment mon GUIIMAGE ce qui au bout d'un moment le fais déplacer a des coordonnées astronomique. A la place j'utilise setRelativePosition qui comme son nom l'indique envoie ma GUIIMAGE à une position RELATIVE de l'écran (en opposition avec Absolue)

donc il me fallait récupérer la position RELATIVE du curseur, la position RELATIVE du GUIMAGE. Soustraire le premier par le deuxieme ( ca c'est ce que tu m'a suggeré pspmy mais que je savais deja seulement j'utilisais des valeurs absolue et la méthode move au lieu de Set RelativePosition donc ca ne marché pas)


Maintenant que j'ai corrigé ca marche meme si il y a un leger décalage (de quelques pixel) entre le moment ou je clique et le moment ou je commence a déplacer ma GUIIMAGE

Donc voila une partie de mon code si ca interresse:

// ICi on teste si le curseur survole la GUI mais il faut aussi quelle soit visible d'ou le "_guiElement->isVisible()==true" en fin de ligne
if ( _curseurPosition.X >=  guiPosition.X and _curseurPosition.X<=guiCoinInferieurDroit.X and _curseurPosition.Y >= guiPosition.Y and _curseurPosition.Y<=guiCoinInferieurDroit.Y and _guiElement->isVisible()==true)
    {

            // si on clique et qu'on bouge alors que le curseur survole alors la fenetre devient deplacable
            if  (Mousedown==1 and CI_event.MouseInput.Event== EMIE_MOUSE_MOVED )
            {


                if (deplacable==0)
                {
                p_ClickOffsetX= (_curseurPosition.X) -guiPosition.X;  // les variable p_ClickOffsetX et p_ClickOffsetY permet d'éviter le décalage lorsque je déplacerais la GUIIMAGE 
                p_ClickOffsetY= (_curseurPosition.Y) -guiPosition.Y;
                deplacable=1;
                }

             
             _guiElement->setRelativePosition ( rect< f32 > (_curseurRelativePosition.X-(p_ClickOffsetX/1000),_curseurRelativePosition.Y-(p_ClickOffsetY/1000),(_curseurRelativePosition.X-(p_ClickOffsetX/1000))+0.411,(_curseurRelativePosition.Y-(p_ClickOffsetY/1000 ))+0.660));
 


            }


Hors ligne


#10 

21-11-2008 11:27:42

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.83.51
Courriel

Ca va surement me servir bientôt smile merci d'avoir posté le code !

Hors ligne


#11 

21-11-2008 11:58:01

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.5
Courriel

le decalage et du a la représentation graphique du curseur


Hors ligne


#12 

23-11-2008 08:03:43

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 90.43.94.229
Courriel

le decalage et du a la représentation graphique du curseur

pas du tout. La représentation graphique du curseur n'y est pour rien puisque sa position sur l'écran est défini par la pointe de sa fleche. En fait j'ai trouvé pourquoi :

je donnais à setRelativePosition la position relative du curseur en x et y (ca c'est correct) et les variables p_ClickOffsetX et p_ClickOffsetY qui ont des valeurs absolue lorsque je l'ai créé et que je converti en valeur relative en divisant par 1000 (et ca c'est pas bon. Ne pas faire). Ce qui au final me donne ue valeur arrondie de p_ClickOffsetX et p_ClickOffsetY et non plus une valeur exact si j'avais directement une valeur relative. Bon c chaud à comprendre lol mais le truc c'est qu'il faut evité de jouer avec les valeurs absolue et relative, d'essayer de les convertir, etc. Ca donne des approximation. Et le décalage que j'avais precédement s'accentué lorsque j'augmentait la taille de mon device (la fenetre de l'application).

Au final c'est bien la méthode move qu'il fallait utilisé (lol) qui n'attends que des valeurs absolue (donc je n'ai rien a convertir c'est plus simple). Voila le code modifié

// si le curseur bouge ben ma gui Bouge
if (CI_event.MouseInput.Event== EMIE_MOUSE_MOVED )
              {
                    if (deplacable==0)
                    {
                        p_ClickOffsetX= _curseurPosition.X -guiPosition.X;  // pour éviter le décalage
                        p_ClickOffsetY= _curseurPosition.Y -guiPosition.Y;


                        deplacable=1;

                    }

                   _guiElement->move  (position2d< s32 >((_curseurPosition.X -p_ClickOffsetX)-guiPosition.X,(_curseurPosition.Y -p_ClickOffsetY)-guiPosition.Y));

              }

Comme je l'ai dit un peu plus haut move entraine un mouvement constant donc pour éviter que mon image ne parte à l'infinie je soustrait sa futur position à savoir (_curseurPosition.X -p_ClickOffsetX) en x et (_curseurPosition.Y -p_ClickOffsetY) en y par sa position actuel à savoir guiPosition.X en x et guiPosition.Y en y.

Et la ca marche impec, il n'y a plus aucun décalage et je peux déplacer précisement ma GUI et meme en changeant la taille du device.

++


Hors ligne


#13 

23-11-2008 11:48:42

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.5
Courriel

ce qui revien a se que javais dit ^^

pspmy Ecris:

finalpos = curpos - elementpos;


Hors ligne


#14 

23-11-2008 11:59:40

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 90.43.94.229
Courriel

euh peut etre mais imcomplet.


Hors ligne


#15 

23-11-2008 15:25:49

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.5
Courriel

lol


Hors ligne


#16 

23-11-2008 15:52:34

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 90.43.107.92
Courriel

si je fais:

finalpos = curpos - elementpos;

Le point de pivot de l"element (c'est à dire le coin supérieur gauche) se placera exactement sur la position du curseur. Ce qui provoque un décalage lorsque l'on clique. Ce qui n'est pas bon !!!


Hors ligne


#17 

19-12-2008 09:53:11

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 90.43.97.143
Courriel

Je suis passé à la version 1.5 de Irrlicht et on peut désormais utiliser aussi la commande setRelativePosition

guiElement->setRelativePosition(position2di (curseurPosition.X-m_ClickOffsetX,curseurPosition.Y-m_ClickOffsetY));

Bon cette commande marchait déja avant (en fait pas vraiment ca buggé) mais la fonction est beaucoup plus intuitive et pratique a utiliser en 1.5. En fait c'est pas tout a fait pareil qu'avant.

Donc on peut utiliser setRelativePosition ou move (avec la méthode que j'ai donné plus haut).


Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
169 invités en ligne
membre en ligne: -
RSS Feed