[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 09/01/2016 19:40 | #
Ben, tu dl et tu testes
J'avais utilisé cette lib pour Fastar et elle fonctionne
Citer : Posté le 09/01/2016 21:01 | #
Ben, tu dl et tu testes
Je ne peux pas tester actuellement [...]
J'avais utilisé cette lib pour Fastar et elle fonctionne
Tu l'avais développé sous SH3 ou sous SH4 ?
Citer : Posté le 10/01/2016 20:26 | #
Ouaip, ça fonctionne sur SH4 .
Par contre F1 ne fonctionne pas ...
Ajouté le 10/01/2016 à 20:28 :
Ah en fait j'ai changé le 54 en 55 à cet endroit et c'est bon .
Parce que sinon la fonction jusqu'à la touche F1 (code 79) et s'arrêtait sans la prendre en compte .
{
int i;
for (i=0; i<[b][red]55[/red][/b]; i++)
{
last_key[i] = current_key[i];
if (key_down(i+25))
{
if (current_key[i] < 255)
{
current_key[i] ++;
}
} else {
current_key[i] = 0;
}
}
}
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 10/01/2016 20:31 | #
Change le 54 par 55 aussi ligne 13 et 14 et tiens moi au courant.
J'ai corrigé le fichier source.
Citer : Posté le 10/01/2016 20:33 | #
Ouaip j'ai aussi changé ligne 13 et 14, ça marque nickel .
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 10/01/2016 21:10 | #
Voilà, j'ai corrigé le problème de F1 et j'ai rajouté une nouvelle fonction int input_any_key().
Normalement tout est bon.
J'ai juste un problème sur le AC/ON, visiblement il ne semble pas fonctionner. Mais le problème ne doit pas venir de la Lib, putôt du SysCall à mon avis.
Citer : Posté le 10/01/2016 21:23 | #
Aaaaah bah voilà la fonction qui input_any_key ! Je l'avais créée pour mon programme vite-fait mais maintenant j'utilise la tienne .
Merci Ninestars, il fallait que quelqu'un fasse cette librairie un jour quand même .
D'ailleurs une petite idée d'amélioration si ça te tente : pouvoir tester plusieurs touche en même temps, je m'explique avec un exemple de comparaison :
//Le truc de base, juste une condition qui requiert l'appuis de plusieurs touches
//Et ce serait cool si on pouvait l'écrire comme ça :
if(input_multi_press(76, 29, 31, 71)){...}
Enfin voilà , ça permettrait de mieux rentrer les conditions , plus proprement , je suis sûr que c'est faisable .
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 10/01/2016 22:05 | #
Alors le problème, c'est qu'il faudrait préciser le nombre de touches qui passent en argument.
Par exemple : input_trigger(3, K_LEFT, K_F1, K_1)
Ou alors mettre un zéro à la fin : input_trigger(K_LEFT, K_F1, K_1, 0)
Ce qui au final est plus embetant qu'autre chose
Citer : Posté le 10/01/2016 22:13 | #
Hum, c'est vrai, mais je préfère mettre un 0 au bout plutôt que de mettre plusieurs fois input_press() .
Et si on mettait un tableau direct en argument ?
Comme ça pas besoin de définir sa taille .
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 10/01/2016 22:42 | #
Justement, un tableau, il faut connaitre sa taille pour le parcourir. Sinon, comment sait-on si on est en train de lire les données du tableau ou en dehors ?
J'avais pensé à refaire toutes les fonctions de façon à ce qu'elles puissent prendre plusieurs paramètres.
Certaines auraient aucun sens par exemple trigger. Il faudrait appuyer exactement pendant la meme frame sur les différentes touches...
Et j'ai pas envie de devoir mettre un argument en plus juste pour dire le nombre d'arguments que je rentre...
Mais je pourrais faire seulement quelques fonctions en plus, pour pouvoir définir des combos par exemple.
Je vais y réfléchir
Citer : Posté le 10/01/2016 23:05 | #
Ouaip bonne idée les combos .
Mais avec malloc() normalement on peut passer des tableaux sans connaitre leur taille nan ?
Oui pour trigger après c'est bête, mais juste pour press ça peut être bien .
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 10/01/2016 23:18 | #
Yep, en C on ne peux pas connaitre la taille d'un tableau uniquement via son pointeur, sauf si il y a une valeur particulière de fin comme pour les strings. Après, passer un argument de plus c'est assez facile à mettre en place.
Ça me donne encore une petite idée de bibli de fonctions de manipulation de tableaux
Citer : Posté le 12/01/2016 15:29 | #
Voila j'ai un problème, lorsque je lance mon add in sur SH4, j'ai une erreur de Syscall:
TARGET = D201422B.
PC = 0030E6A8
- Kirby's DreamLand : Gobe , Gobe , Gobe !!!
- L'invasion Seanchans : Détruit la flotte ennemis a bord du "Danseur des vagues".
Citer : Posté le 12/01/2016 18:06 | #
J'ai juste un problème sur le AC/ON, visiblement il ne semble pas fonctionner. Mais le problème ne doit pas venir de la Lib, putôt du SysCall à mon avis.
AC/ON est plutôt particulier à vrai dire, vérifie la valeur de retour 0 avec le code valide ! C'est parce qu'il est complètement en bordure de la keymap...
Au passage, mes propres tests de la méthode de SimLo sur ma SH4 échouaient, donc je regarderai de nouveau... ça m'intrigue particulièrement parce que c'est le point crucial de gint qui me résistait encore...
Citer : Posté le 12/01/2016 18:22 | #
J'avais regardé un peu la syscall de clavier et c'est un peu bizarre ...
Enfin je suis content de voir que ton truc marche (j'en étais encore à la V1 )
Citer : Posté le 13/01/2016 18:34 | #
vérifie la valeur de retour 0 avec le code valide !
C'est parce qu'il est complètement en bordure de la keymap...
Pour la compatibilité SH4, j'ai pris le code de quelqu'un (Dodormeur il me semble bien). Je n'y connait rien
Merci Florian66, en effet je trouve cette lib assez essentielle
Citer : Posté le 14/01/2016 19:45 | #
C'est à dire ? Je n'ai pas compris.
Référence aux syscalls. L'un d'eux renvoie parfois un code de retour signifiant qu'une touche a été détectée mais renvoie en même temps 0 : c'est à comprendre comme AC/ON.
C'est pas plutot la flèche qui est en bordure de la keymap ? Son numero est 25 alors que AC c'est 34.
Il faut regarder les matrix codes. AC/ON est la seule touche sur la ligne 0.