Tout d'abord, bonjour a tous!
Je m'amuse en ce moment avec Irrlicht (et je dois dire qu'il est extremement facile a prendre en main) mais voila j'ai deux remarques qui m'ont fait me creuser la tete et maintenant que je connais la reponse, je pense que cela pourrait faire gagner du temps a pas mal de gens...
Remarque Interruptions Souris:
J'ai remarque que sur ma version d'irrlicht (1.2) les numeros associes aux interruptions souris etaient errones. Je vous donne donc les numeros que j'ai obtenus:
Remplacez dans Keycodes.h: KEY_LBUTTON = 0x01, // Left mouse button KEY_RBUTTON = 0x02, // Right mouse button KEY_CANCEL = 0x03, // Control-break processing KEY_MBUTTON = 0x04, // Middle mouse button (three-button mouse) KEY_XBUTTON1 = 0x05, // Windows 2000/XP: X1 mouse button KEY_XBUTTON2 = 0x06, // Windows 2000/XP: X2 mouse button par: KEY_LBUTTON_PRESSED 0x00, // Left mouse button down KEY_RBUTTON_PRESSED 0x01, // Right mouse button down KEY_MBUTTON_PRESSED 0x02, // Middle mouse button down KEY_LBUTTON_RELEASED 0x03, // Left mouse button up KEY_RBUTTON_RELEASED 0x04, // Right mouse button up KEY_MBUTTON_RELEASED 0x05, // Middle mouse button up KEY_MOUSE_MOVED 0x06, KEY_WHEEL_CHANGED 0x07,
Remarque Interruptions Clavier:
Les interruptions claviers arrivent chaque fois qu'on appuie ou qu'on relache une touche mais comment tester si plusieurs touches sont enfoncees simultanement?
Pour ce faire, on peut creer un mapping/masque de touche pour noter chaque touche qui est enfoncee et chaque touche qui est relachee a chaque evenement leve afin d'avoir en permanence l'ensemble des touches qui sont utilisees a chaque nouvelle interruption.
bool KeyMap[255]; bool OnEvent(irr::SEvent event) { if (event.EventType == irr::EET_KEY_INPUT_EVENT) { KeyMap[event.KeyInput.Key] = event.KeyInput.PressedDown; return event.KeyInput.PressedDown; } return false; } void OnPreRender() { if (KeyMap[irr::KEY_UP]) //move up... if (KeyMap[irr::KEY_DOWN]) //move down... if (KeyMap[irr::KEY_LEFT]) //move left... if (KeyMap[irr::KEY_RIGHT]) //move right... }
Ainsi toutes les touches enfoncees simultanement seront a true et les autres a false. Dans mon exemple les 7 premiers elements du tableau ne seront jamais affectes (car ce sont les valeurs des evenements souris).
pour faire un peu mieux, vous pouvez regarder comment sont geres les evenements clavier dans le source code de CCameraFPSSceneNode.cpp :
OnEvent() et animate()
J'espere que ce petit exemple vous sera utile...
Vraiment sympa, merci beaucoup !
Hors ligne
super interressant, c'est a utiliser absolument !
Hors ligne
Bonjour,
J'ai un petit soucis avec ce tutorial. J'utilise irrlicht.NET (le problème vient peut être de là) et j'ai besoin d'utiliser plusieurs touches en même temps (il s'agit d'un jeu de pong qui se joue sur la même machine et donc les deux joueurs doivent pouvoir bouger leur raquette en même temps).
Simplement il semblerait que lorsque un joueur maintient appuyer une touche et qu'ensuite l'autre joueur décide lui aussi de maintenir appuyer une touche, seul le deuxième joueur dispose alors du contrôle car irrlicht (malgré le mapping) ne considère que seul la touche du deuxième joueur est pressé.
Est-ce normal?
Hors ligne
Bonjour,
es-tu sûr d'avoir implementé le programme comme indique ci dessus?
Le mapping, normalement, est là pour garder en mémoire les dernières touches enfoncées et la série de ifs (et non pas de if, else ifs) permet donner une action pour chacune des touches enfoncées simultanément. Je pense que tu devrais rajouter un print du genre dans la méthode onEvent():
printf("La touche %d est ",event.KeyInput.Key); if (event.KeyInput.PressedDown) printf("enfoncé\n"); else printf("relachée\n");
Ainsi, tu pourras voir si ton gestionnaire d'événements considère que la touche du joueur 1 a été relachée alors que le joueur 2 appuye appuie sur une autre touche.
Pour le moment, je ne peux pas t'aider plus que ca.
Avec ces prints, tu pourras voir également quel est le maximum de touche que tu peux enfoncer en même temps (il y a toujours une limite avec les claviers qui est generalement entre 4 et 6).
Hors ligne
White Threat :
Bonjour,
es-tu sûr d'avoir implementé le programme comme indique ci dessus?
Le mapping, normalement, est là pour garder en mémoire les dernières touches enfoncées et la série de ifs (et non pas de if, else ifs) permet donner une action pour chacune des touches enfoncées simultanément. Je pense que tu devrais rajouter un print du genre dans la méthode onEvent():Code:
printf("La touche %d est ",event.KeyInput.Key); if (event.KeyInput.PressedDown) printf("enfoncé\n"); else printf("relachée\n");Ainsi, tu pourras voir si ton gestionnaire d'événements considère que la touche du joueur 1 a été relachée alors que le joueur 2 appuye appuie sur une autre touche.
Pour le moment, je ne peux pas t'aider plus que ca.
Avec ces prints, tu pourras voir également quel est le maximum de touche que tu peux enfoncer en même temps (il y a toujours une limite avec les claviers qui est generalement entre 4 et 6).
Justement, j'ai déja utilisé la méthode que tu as indiqué pour voir comment était envoyé les évenements et il se trouve qu'a chaque fois, le fait de maintenir appuyer une touche en même temps qu'une autre fait relever la première touche appuyé.
Donc ici la limite serait de 1 touche en même temps?
Hors ligne
Apparemment, ce serait le cas...
je suis desole que ma methode ne fonctionne qu'en C++.
L'autre possibilite est que tu recuperes directement les evenements (Windows si tu travailles sur cet OS ou Linux mais je ne sais pas le gerer autrement qu'en assembleur sur Linux...) et que tu fasses ton propre traitement d'evenements...
Je suis desole encore une fois mais je ne peux pas t'aider plus que ca.
Bonne chance.
Hors ligne
White Threat :
Apparemment, ce serait le cas...
je suis desole que ma methode ne fonctionne qu'en C++.
L'autre possibilite est que tu recuperes directement les evenements (Windows si tu travailles sur cet OS ou Linux mais je ne sais pas le gerer autrement qu'en assembleur sur Linux...) et que tu fasses ton propre traitement d'evenements...
Je suis desole encore une fois mais je ne peux pas t'aider plus que ca.
Bonne chance.
Merci, après des essais infructueux avec sdl, j'ai utilisé xna et là ca marche comme sur des roulettes (même si le programme n'est plus portable sous linux).
Hors ligne
Pages: 1