Clavier : detection de plusieurs touches simultannées

WolfSpirit Messages postés 20 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 18 septembre 2008 - 17 sept. 2008 à 03:47
WolfSpirit Messages postés 20 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 18 septembre 2008 - 18 sept. 2008 à 12:47
Bonjour,
Je m'amuse à coder un petit jeu de rythme type guitar hero.
J'ai donc besoin d'un traitement clavier très réactif, et de + il faut souvent détecter des appuis sur + de 3 touches à la fois.
J'ai bien essayé avec getAsyncKeyState mais à priori cette commande est obsolète quand il y a + de 3 touches appuyées à la fois ... et il semble que quand je change très vite de touches appuyées le traitement ne suit pas.

voici comment je procède :
    if(GetAsyncKeyState(VK_F1) & 0x8000) button[0] = true; else button[0] = false;
    if(GetAsyncKeyState(VK_F2) & 0x8000) button[1] = true; else button[1] = false;
    if(GetAsyncKeyState(VK_F3) & 0x8000) button[2] = true; else button[2] = false;
    if(GetAsyncKeyState(VK_F4) & 0x8000) button[3] = true; else button[3] = false;
    if(GetAsyncKeyState(VK_F5) & 0x8000) button[4] = true; else button[4] = false;
    if(GetAsyncKeyState(VK_SPACE) & 0x8000) button[5] = true; else button[5] = false;
    if(GetAsyncKeyState(VK_RETURN) & 0x8000) button[6] = true; else button[5] = false;

il me suffit après de tester les booléens button[x]...
mais comme je l'ai dit plus haut lorsque j'appuis sur + de 3 touches à la fois ça ne marche pas, comment pourrais-je faire ? et sinon existe-t-il une lib spécialisée dans les traitements lourds du clavier ?

Merci.

7 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
17 sept. 2008 à 11:26
Salut,
Essayes plutôt de passer par un hook clavier, tu auras surement un meilleures résultats.
Tu trouveras de nombreuses sources sur ce site.

Shell
0
WolfSpirit Messages postés 20 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 18 septembre 2008
17 sept. 2008 à 12:08
Merci,
j'ai essayé d'utiliser un hook mais le problème c'est que j'ai fait ce jeu en SDL et je ne trouve pas comment récupérer le hInstance qui est demandé dans la fonction SetWindowsHookEx avec SDL... quelqu'un a une idée ?
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
17 sept. 2008 à 15:24
Pour rappel, ton hook doit se faire dans une dll.
Le paramètre hMod (HINSTANCE) sera mis à NULL car rattaché au thread appellant, soit ton jeu sdl.
0
WolfSpirit Messages postés 20 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 18 septembre 2008
17 sept. 2008 à 15:31
Oula, ça m'a l'air compliqué pour un petit jeu de rythme quand même ... :p
Y'a pas un moyen plus simple avec DirectInput par exemple de savoir si + de 3 touches sont enfoncées ? sans parler forcemment de hook, parce que je trouve que là ça commence à partir loin pour ce que c'est :p
J'ai recodé tout le coeur du jeu en DirectX, donc je peux maintenant l'utiliser, seul hic je viens de me rendre compte que lui aussi dès qu'on a plus de 3 touches enfoncées il ne compte pas la 4eme ...
Alors, y'a moyen concretement sans hook ou pas ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
WolfSpirit Messages postés 20 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 18 septembre 2008
17 sept. 2008 à 15:43
Bon je viens de vérifier dans un autre jeu de rythme, c'est pareil, quand j'appuie sur plus de 3 touches à la fois il comprend pas, c'est pas dû à mon programme spécialement ^^
je vais donc me débrouiller comme ça, en tout cas en recodant en DX au lieu de SDL j'ai gagné une énorme rapidité sur la gestion du clavier ! donc tant mieux :)
merci pour l'aide en tout cas DeAtHCrAsH ;)
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
17 sept. 2008 à 22:04
Salut,
Pour lire l'état courant de toutes les touches du clavier il existe GetKeyboardState().  Cette fonction copie l'état actuel du clavier dans un tableau de 256 octets. Les codes virtuels (VK_xxx) seront utilisés comme indexes du tableau pour tester l'état d'une seule touche ou d'un groupe de touches. Puisque l'état des touches est exprimé sous forme de bits, on peut créer une petite fonction qui retourne, dans un autre tableau, les codes virtuels de toutes les touches enfoncées actuellement.
Pour le hook clavier, tu peux te passer de DLL sous Windows 2000, XP ou Vista. Tu trouveras, parmi mes codes sources, un exemple à ce sujet.
Pour la réactivité, je pense que tu ne trouveras pas mieux que DirectInput.
0
WolfSpirit Messages postés 20 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 18 septembre 2008
18 sept. 2008 à 12:47
Ouais merci :)
je savais pour le GetKeyboardState, mais le problème vient de mon clavier je pense, c'est simple, quand j'appuie par exemple sur F1 + F2 + F3, il ne détecte que F1 et F2 enfoncées, pourtant si je fais F2 + F3 + F4 là ça passe ... ça dépend de quelles touches j'enfonce à la fois... et pour 4 ou 5 touches à la fois j'oublie c'est même pas la peine. Par contre, j'ai branché un périphérique qui a remplacé mon clavier sur mon ordi (une WiiGuitar) et là, quand j'appuie sur les 5 frettes à la fois, j'ai bien les 5 touches qui s'allument. Le problème viendrait donc, à priori, du clavier. Mais c'est bisarre car j'ai testé sur 2 claviers différents, même problème. Enfin bon, ça ne me dérange pas trop pour la suite donc ça va. Et puis j'ai tout passé de SDL à DX, j'ai donc gagné énormément en performances, et ça me permet d'utiliser DInput aussi :)
0
Rejoignez-nous