#0 

20-11-2008 12:55:08

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

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:

Code:

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

Code:

  _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


#1 

20-11-2008 13:34:25

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

je croi que c'est un probleme de conversion

Dernière modification par pspmy (20-11-2008 13:35:15)

Hors ligne


#2 

20-11-2008 13:53:15

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

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


#3 

20-11-2008 16:56:09

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

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

Hors ligne


#4 

20-11-2008 16:57:13

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

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

Hors ligne


#5 

20-11-2008 17:08:33

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

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


#6 

20-11-2008 18:23:46

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

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


#7 

21-11-2008 09:02:57

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

sa a résolue ton problème ?

Hors ligne


#8 

21-11-2008 10:15:29

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

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:

Code:

// 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


#9 

21-11-2008 12:27:42

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

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

Hors ligne


#10 

21-11-2008 12:58:01

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

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

Hors ligne


#11 

23-11-2008 09:03:43

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

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é

Code:

// 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


#12 

23-11-2008 12:48:42

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

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


#13 

23-11-2008 12:59:40

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

euh peut etre mais imcomplet.

Hors ligne


#14 

23-11-2008 16:25:49

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

lol

Hors ligne


#15 

23-11-2008 16:52:34

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

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


#16 

19-12-2008 10:53:11

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

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


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
67 invités en ligne
Aucun membre connecté
RSS Feed