[Librairie C] Contrôle avancé du clavier V2 corrigée
Posté le 30/08/2014 20:29
L'avantage que possède la programmation en C/C++ est d'avoir accès à toutes les touches du clavier rapidement, mais de base la gestion du clavier reste assez primaire.
Je vous présente ma librairie que j'utilise pour gérer efficacement le clavier. Elle est à télécharger en
fichier joint
Première étape :
Il faut inclure input.h dans vos fichier .c
Chaque touche est associée à un mot clef. Par exemple la touche "flèche gauche" correspond à K_LEFT.
Pour voir le nom de chaque touche, il suffit de regarder dans "input.h"
Liste des fonctions :
void input_update()
Cette fonction mets à jour le clavier en enregistrant l'état actuel de toutes les touches.
Il faut appeler cette méthode une seule fois par frame car une fois qu'elle à été appelée toutes les fonctions qui suivent seront mise à jour.
int input_any_key()
Cette fonction renvoie 1 si une touche quelconque est pressée, 0 sinon.
int input_press(char key)
Cette fonction renvoie l'état de la touche demandée.
1 si la touche est pressé, 0 sinon.
int input_trigger(char key)
Cette fonction très utile renvoie 1 au moment où la touche est appuyée puis renvoie 0, même si la touche est encore pressée.
Elle envoie une impulsion au moment où on appuie.
int input_release(char key)
Envoie une impulsion au moment où on relâche la touche.
int input_hold_short(char key)
Cette fonction renvoie 1 si la touche est pressée depuis un court instant, 0 sinon.
int input_hold_long(char key)
Cette fonction renvoie 1 si la touche est pressée depuis un long instant, 0 sinon.
int input_repeat(char key)
Fonction extrêmement utile ! Pour les curseurs notamment !
Au moment où on appuie la fonction renvoie 1, puis 0. Si on reste appuyé la fonction renvoie des impulsions à intervalle réguliers.
Exemple : On reste appuyé sur la flèche du bas pour déplacer un curseur, par exemple dans un menu.
Le curseur descend d'un seul cran, attend quelques instants, puis descend à intervalle régulier cran par cran.
cela permet de choisir précisément tout en allant vite. C'est le même principe que les touches d'un ordinateur.
int input_repeat_short(char key)
Même principe que input_repeat() mais avec des intervalles plus court.
int input_dir4()
Cette fonction renvoie la direction pointée par les touches fléchées selon la disposition du pavé numérique sans prendre en compte les diagonales.
Renvoie 0 si aucune touche fléchée n'est pressée.
Exemple : si on appuie sur la flèche de droite, la fonction renvoie 6.
int input_dir8()
Même principe que input_dir4() mais prend en compte les diagonales.
Pavé numérique
Pavé numérique
Utilisation :
Il n'est pas utile et même fortement inutile d'ailleurs d'appeler input_update chaque fois avant d'utiliser les fonctions input_
Il faut l'appeler une seule fois par frame.
Le mieux est de suivre un code de ce type :
while (1) // Boucle principale
{
input_update(); // On mets à jour l'etat du clavier
...
if (input_trigger(K_LEFT))
{
...
}
if (input_repeat(K_SHIFT))
{
...
}
...
setFps(); // conseille
}
Il est conseillé de combiner cela avec une régulation des FPS : voir
ici
Et voilà !
J'ai repris key_down() écrit par je ne sais pas qui, donc il me semble que c'est compatible SH4
Fichier joint
Citer : Posté le 30/08/2014 20:33 | #
cool On est obligé de tous le tyemps réactualiser le clavier ?
Citer : Posté le 30/08/2014 20:36 | #
Ça a l'air sympa tout ça.
Tu pourrais indiquer le temps en ms auquels correspondent tes délais "short" et "long" ?
Et sinon, je suppose que tu utilises les syscalls ?
Et comment envoies-tu tes "impulsions" ? Lorsque input_trigger() renvoie 0 car il a déjà renvoyé 1, est-ce que input_press() renvoie toujours 1 ?
Citer : Posté le 30/08/2014 20:44 | #
Merci
En fait il n'y a aucun Sleep(), il s'utilise en complément d'un système pour réguler les fps, donc il n'y a pas de temps en ms constant pour mes fonctions, c'est juste qu'elle sont optimisées pour 20 à 30 fps.
Le principe des impulsions est le suivant : (c'est plus simple avec un exemple ^^ )
[spoiler]// on appuie pas sur la touche EXE
input_update();
input_trigger(K_EXE); // renvoie 0
// on appuie sur la touche EXE
input_update();
input_trigger(K_EXE); // renvoie 1
// on appuie encore sur la touche EXE
input_update();
input_trigger(K_EXE); // renvoie 0
// on appuie encore sur la touche EXE
input_update();
input_trigger(K_EXE); // renvoie 0
//... à l'infini
// on appuie plus sur la touche EXE
input_update();
input_trigger(K_EXE); // renvoie 0[/spoiler]
input_press() renvoie toujours 1 tant qu'on appuie, c'est la fonction "basique" :)
Citer : Posté le 30/08/2014 20:45 | #
Donc tu gères tes impulsions via des données statiques / globales ?
Citer : Posté le 30/08/2014 20:47 | #
J'ai deux tableaux déclarés en global dans input.c qui enregistrent les touches à cet instant et à l'instant précédent pour faire les comparaisons.
Enfin je comprend pas trop ta question :/
C'est juste la condition qui renvoie 0 ou 1 à différent moment en fonction de la fonction appelée.
Citer : Posté le 30/08/2014 20:52 | #
En fait je ne saisissais pas comment tu pouvais gérer tes impulsions sans données persistantes, mais si tu as des tableaux en global, ça s'expliquer.
Et tu utilises libfx ou les sycalls ?
Citer : Posté le 30/08/2014 20:54 | #
Ok
Les sycalls ! Vérifier l'état de toutes les touches via libfx était affreusement long ! Je pouvais le faire que 5 fois par seconde... Là c'est 500 fois de suite ça change quasiment rien !
Citer : Posté le 30/08/2014 20:56 | #
Ah ok, bien ça
Je ne fais qu'émettre une hypothèse car tout le monde ne sera pas forcément d'accord, mais on aura peut-être besoin de telles fonctions pour la libc de gcc.
Citer : Posté le 30/08/2014 21:04 | #
Si elles peuvent être reprises avec plaisir
@Florian : J'ai pas vu tu as édité. Oui il faut actualiser à chaque frame le clavier, mais ne veut pas dire qui faut appeler input_update() à chaque fois juste avant d'utiliser une fonction. Une fois que la fonction est appelée tu peux utiliser toutes les autres fonctions input_ autant que tu veux pendant ta frame.
Citer : Posté le 30/08/2014 21:31 | #
ah d'accord merci
Citer : Posté le 31/08/2014 01:09 | #
Keydown n'est pas compatible SH4 :/
Citer : Posté le 31/08/2014 11:28 | #
Hum... Moi je fais "if(key_down(le numéro de la touche))...;" et c'est compatible SH4
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 31/08/2014 11:55 | #
if (IsKeyDown (...)) et IsKeyUp sont compatibles SH4 pour moi... ou dans lz cas contraire il passent très bien au SH4CT
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 31/08/2014 12:30 | #
est ce que il y aura une fonction anti répétition des touches(on appuie sur une touche puis on doit relacher puis reappuyer)?
Citer : Posté le 31/08/2014 12:52 | #
Elle y est déjà, regarde mieux
Citer : Posté le 31/08/2014 12:57 | #
laquelle?j'ai trouvéCiter : Posté le 01/09/2014 00:40 | #
Du coup key_down est compatible ?
C'est input_trigger() que tu cherchais Intelligide nan ?
Citer : Posté le 01/09/2014 12:13 | #
Oui, key_down est compatible . Je l'utilise avec la version SH4 du SDK, et elle passe aussi très bien au SH4CT .
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 01/09/2014 19:46 | #
@ninestar oui, c'est ça
j'ai un problème quand je fait ça
ToucheEXE=input_trigger(K_EXE);
ToucheRIGHT=input_press(K_RIGHT);
ToucheLEFT=input_press(K_LEFT);
ToucheSHIFT=input_press(K_SHIFT);
ToucheALPHA=input_press(K_ALPHA);
les touches EXE, RIGHT et LEFT réagissent bien mais aucune réponse de SHIFT et de ALPHA
Citer : Posté le 01/09/2014 21:19 | #
Au fait, tu pourrais retourner et prendre des int quand même.
La norme veut qu'on n'utilise des char que lorsqu'il s'agit vraiment de caractères.
Et ne me dites pas que c'est pour économiser la mémoire : ça ne sert à rien du tout.