Clavier : detection de plusieurs touches simultannées

Signaler
Messages postés
20
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
18 septembre 2008
-
Messages postés
20
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
18 septembre 2008
-
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

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
20
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
18 septembre 2008

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 ?
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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.
Messages postés
20
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
18 septembre 2008

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 ?
Messages postés
20
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
18 septembre 2008

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 ;)
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
20
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
18 septembre 2008

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