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
je croi que c'est un probleme de conversion
Dernière modification par pspmy (20-11-2008 13:35:15)
Hors ligne
c'est a dire ?
tu parle de coordonnées relatives et coordonnée absolue ?
Dernière modification par Dragonblood (20-11-2008 13:57:48)
Hors ligne
je pense car si tu sort de l'ecran tu obtien -0....
Hors ligne
sinon dans les esample dans la demo 2d graphiqs il montre comment bouger une image avec draw2dImage()
Hors ligne
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
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;
Dernière modification par pspmy (23-11-2008 12:49:47)
Hors ligne
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)); }
Dernière modification par Dragonblood (21-11-2008 10:20:52)
Hors ligne
Ca va surement me servir bientôt merci d'avoir posté le code !
Hors ligne
le decalage et du a la représentation graphique du curseur
Hors ligne
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
ce qui revien a se que javais dit ^^
pspmy :
finalpos = curpos - elementpos;
Dernière modification par pspmy (23-11-2008 12:49:19)
Hors ligne
euh peut etre mais imcomplet.
Hors ligne
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
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).
Dernière modification par Dragonblood (19-12-2008 10:54:07)
Hors ligne