Interruptions clavier et souris

Proposé par White Threat

le 18 December 2006 à 14h 32mn 34s

12350 visualisations



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:

Code:

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.

Code:

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


#1 

18-12-2006 18:55:12

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Vraiment sympa, merci beaucoup !

Hors ligne


#2 

18-12-2006 22:31:41

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

super interressant, c'est a utiliser absolument !

Hors ligne


#3 

25-12-2006 11:40:49

mystor@fr
Petit nouveau
Date d'inscription: 24-12-2006
Messages: 3

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


#4 

27-12-2006 09:44:53

White Threat
Petit nouveau
Date d'inscription: 18-12-2006
Messages: 7

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).

Hors ligne


#5 

27-12-2006 10:54:49

mystor@fr
Petit nouveau
Date d'inscription: 24-12-2006
Messages: 3

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


#6 

28-12-2006 12:00:24

White Threat
Petit nouveau
Date d'inscription: 18-12-2006
Messages: 7

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


#7 

01-01-2007 18:54:07

mystor@fr
Petit nouveau
Date d'inscription: 24-12-2006
Messages: 3

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


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
125 invités en ligne
Aucun membre connecté
RSS Feed