[SDL] Evénements en cascade, Gérer la souris. |
Bienvenue invité ( Connexion | Inscription )
[SDL] Evénements en cascade, Gérer la souris. |
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 |
|
|
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 |
|
|
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. |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
Nous sommes le : 29th March 2024 - 14:39 |