IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> [SDL] Evénements en cascade, Gérer la souris.
Options
iFef
posté 16 Apr 2011, 17:25
Message #1


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 748
Inscrit : 22 Jan 2006
Membre no 54 042



Bonjour,

Je suis sur un petit projet d'info en SDL, rien de difficile jusque la mais je bloque maintenant sur la manière dont l'on gère les événements souris (clic, déplacement,..).

J'aimerai faire un truc du style :
Code
touche clavier
    blablabla
    
clic souris
    clic droit
        deplacement
            action 1 : rotation
    clic gauche
        deplacement
            action 2 : translation


J'ai essayé deux trois trucs sans reussir.

Rien que ça déja ça ne fonctionne pas :
Code
case SDL_MOUSEBUTTONDOWN:
    SDL_WaitEvent(&event2);
    switch(event2.type)
    {
        case SDL_MOUSEMOTION:
            angleRotationX=(int)((event2.motion.x));
            angleRotationY=(int)((event2.motion.y));
            calculerMatriceTransformation();
            calculerImageCube();
            dessinerCube();
        break;
    }
break;


Si quelqu'un pouvait m'éclairer.

fef
Go to the top of the page
 
+Quote Post
matt_b
posté 16 Apr 2011, 22:06
Message #2


Adepte de Macbidouille
*

Groupe : Membres
Messages : 56
Inscrit : 24 Feb 2007
Lieu : en bretagne, entre rennes et saint brieuc
Membre no 81 376



de mes vieux souvenir de SDL,
SDL_WaitEvent(&event2); est bloquant et c'est lui qui va te mettre une valeur dans event2 dans ce cas pourquoi as tu un "case SDL_MOUSEBUTTONDOWN:" avant ? montre nous un peu le code qu'il y a autour.

Si je comprends bien ce que tu veux faire, tu dois vouloir faire un sorte de "drag 'n drop" avec clique gauche ou clique droit.
le soucis quand tu fait ton clique, c'est que le prochain evènemet récupéré par SDL_wait_event ne sera pas forcement un déplacement. ou alors il sera imperceptible. essaye de faire
Code
case SDL_MOUSEBUTTONDOWN:
  retenir position souris
  while (qqch, )
     {
    SDL_polleventEvent(&event2);
    switch(event2.type)
    {
        case SDL_MOUSEMOTION:
            angleRotationX=(int)((event2.motion.x));
            angleRotationY=(int)((event2.motion.y));
            calculerMatriceTransformation();
            calculerImageCube();
            dessinerCube();
                 case SDL_MOUSEBUTTONUP
                        qqch=0 pour sortir de la boucle
        break;
    }
    }
break;



Tu dois suivre un tutoriel du genre SDL sur le site du zero il y a un exemple vers la fin

[edit] oups poster sans faire exprès

Ce message a été modifié par matt_b - 16 Apr 2011, 22:09.


--------------------
mac user depuis mars 2007 je dois encore dire pas mal de conneries
MBP 15" 2.33ghz 2Go ram
Go to the top of the page
 
+Quote Post
iFef
posté 16 Apr 2011, 23:41
Message #3


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 748
Inscrit : 22 Jan 2006
Membre no 54 042



L'idée c'est de faire bouger un objet à l'aide la souris.

Donc lorsque je clique gauche, et que je bouge la souris je fais varier un paramètre de position. Ce n'est pas plus compliqué que ça.

J'ai déjà suivis le tuto du SDZ mais je l'ai trouvé assez léger et je n'ai pas trouvé la réponse à toutes mes questions.
Go to the top of the page
 
+Quote Post
matt_b
posté 16 Apr 2011, 23:59
Message #4


Adepte de Macbidouille
*

Groupe : Membres
Messages : 56
Inscrit : 24 Feb 2007
Lieu : en bretagne, entre rennes et saint brieuc
Membre no 81 376



Oui, je vois, mais dans ton cas, tu ne boucles pas sur des events.
dès que tu auras bougé de 1 pixel, ton programme ne réagira plus, car tu as 1 event tous les pixels.
il te faut faire une boucle dans le case SDL_MOUSEBUTTONDOWN.
de plus ton sdl_waitevent est bloquant. utilise un sdl_polevent

Code
SDL_MOUSEBUTTONDOWN
   while(butonNotReleased)  // <- while sinon tu es mort dès que tu bouges de 1 pixel !
   {
     sdl_pollevent(&event)    // <- ça devrait marcher avec un wait, mais pas fluide ...
         {
           switch ...
             case SDL_MOUSEMOTION:
             .......
             case SDL_MOUSEBUTTONUP:
             .......
         }
    }


poste tout ton code aussi stp, si ça vien d'autre chose on pourra le voir.


--------------------
mac user depuis mars 2007 je dois encore dire pas mal de conneries
MBP 15" 2.33ghz 2Go ram
Go to the top of the page
 
+Quote Post
iFef
posté 17 Apr 2011, 14:56
Message #5


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 748
Inscrit : 22 Jan 2006
Membre no 54 042



Pas sur que cela changera grand chose mais voila :
CODE
void controles()
{
int bContinuer=1;
int i;

SDL_Event event1,event2;

SDL_EnableKeyRepeat(10,1);

while (bContinuer)
{
SDL_WaitEvent(&event1);
switch(event1.type)
{
case SDL_QUIT:
bContinuer=0;
break;

/* Evenements clavier */

case SDL_KEYDOWN:
switch (event1.key.keysym.sym)
{
/* "Esc" permet de quitter */
case SDLK_ESCAPE:
bContinuer=0;
break;

/* "O" permet de revenir à la situation de départ */
case SDLK_o:
angleRotationX=45;
angleRotationY=45;
angleRotationZ=45;
translationX=0;
translationY=0;
zoom=100;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;

/* "I" permet de modifier le type de rotation */
case SDLK_i:
if(typeRotation==1) typeRotation=0; else typeRotation=1;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;

/* "A,Q,Z,S,E,D" permettent de modifier les angles de rotations */
case SDLK_q:
angleRotationX+=5;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_a:
angleRotationX-=5;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_w: //ou z
angleRotationY+=5;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_s:
angleRotationY-=5;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_e:
angleRotationZ+=5;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_d:
angleRotationZ-=5;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;

/* "R,F,T,G,Y,H" permettent de modifier les paramètres de translation */
case SDLK_r:
translationX+=20.0;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_f:
translationX-=20.0;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_t:
translationY+=20.0;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_g:
translationY-=20.0;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_y:
zoom+=20.0;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;
case SDLK_h:
zoom-=20.0;
calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
break;

/* "P" permet d'animer aléatoirement */
case SDLK_p:
for(i=0;i<100;i++)
{
if(valeurAleatoire(0,1)==0) angleRotationX+=5; else angleRotationX-=5;
if(valeurAleatoire(0,1)==0) angleRotationY+=5; else angleRotationY-=5;
if(valeurAleatoire(0,1)==0) angleRotationZ+=5; else angleRotationZ-=5;

calculerMatriceTransformation();
calculerImageCube();
dessinerCube();
}
break;
}
break;

/* Evenements souris */

// case SDL_MOUSEBUTTONDOWN:
// SDL_WaitEvent(&event2);
// switch(event2.type)
// {
// case SDL_MOUSEMOTION:
// angleRotationX=(int)((event2.motion.x));
// angleRotationY=(int)((event2.motion.y));
// calculerMatriceTransformation();
// calculerImageCube();
// dessinerCube();
// break;
// }
// break;

// case SDL_MOUSEMOTION:
// angleRotationX=(int)((event1.motion.x/10));
// angleRotationY=(int)((event1.motion.y/10));
// calculerMatriceTransformation();
// calculerImageCube();
// dessinerCube();
// break;

}
}
}


fef
Go to the top of the page
 
+Quote Post
matt_b
posté 17 Apr 2011, 18:25
Message #6


Adepte de Macbidouille
*

Groupe : Membres
Messages : 56
Inscrit : 24 Feb 2007
Lieu : en bretagne, entre rennes et saint brieuc
Membre no 81 376



bon, je n'ai pas les fonction calculer
MatriceTransformation();
calculerImageCube();
dessinerCube();

j'ai donc fait des sorties a l'arache dans la console :

Code
you just clicked
motion to268:229
you just clicked
motion to238:277
you just clicked
motion to220:290
you just clicked
motion to278:346
you just clicked
motion to272:367
you just clicked
motion to246:356
you just clicked
motion to261:355
you just clicked


passer le premier sdl_waitevent résoud partiellement le problème. si tu garde tes 2 sdl_Waitevent, tu ne sais pas quel evenement est traité par quelle boucle

bref, (en enlevant les morceaux inutiles),
j'ai enlevé sdl_keyrepeat
Ajouter un boucle autour du dernier switch
Code
        // remove sdl keyrepeat
    while (bContinuer)
    {
        SDL_WaitEvent(&event1);
        switch(event1.type)
        {
            /* Evenements clavier */
            
            case SDL_KEYDOWN:
                switch (event1.key.keysym.sym)
                {                    
                    case SDLK_q:
                        cout<< "case sdl qq" << endl;
                        exit(0);
                    break;
                }
                break;
                
                
            case SDL_MOUSEBUTTONDOWN:
                cout << "you just clicked" << endl;
                bool i=true;
                while(i)
                {
                SDL_WaitEvent(&event2);
                switch(event2.type)
                    {
                    case SDL_MOUSEMOTION:
                        cout << "move to"<< (int)((event2.motion.x)) <<":"<<(int)((event2.motion.y)) << endl;
                        i++;
                        break;
                    case SDL_MOUSEBUTTONUP:
                        cout << "mousse up exiting"<< endl;
                        i=false;
                        break;
                    }
                }
            break;
        }
    }


marche chez moi

Code
...
you just clicked
move to114:400
move to114:398
.....
move to246:209
move to254:205
move to261:201
mousse up exiting
you just clicked
move to234:137
....
move to128:352
move to127:354
move to126:356
mousse up exiting


j'espère que ça résout ton problème.
personnellement je pens qu'il faut faire attention aux sdl_(wait|poll)event a n'en utiliser que un seul, car il me semble ce que tu recois c'est une pile d'événement qui se vide tu ne peut donc pas vraiment prédir en en utilisant plusieurs lequel te donne quoi.
si je devais refaire ta logique de code:
Code
sdl_wait/pollevent
{
switch
    case keyboard
    case mousseboutondown
           raise_flag mousse down
    case mousseboutonup
           raise_flag mousse down
    case mousemotion
            if flag_raise
                   blah...
            if(!flagraise)
                   smthelse
}

tu es sûr de gérer tous les evènement.


--------------------
mac user depuis mars 2007 je dois encore dire pas mal de conneries
MBP 15" 2.33ghz 2Go ram
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 29th March 2024 - 14:39