Forums Casio - Vos tutoriels et astuces

Index du Forum | Vos tutoriels et astuces | [Librairie C] Contrôle avancé du clavier V2 corrigée
Ninestars
Hors ligne
Membre
Niveau: Confirmé
Points: 1877
Défis: 22
Message
Posté le 30/08/2014 20:29

[Librairie C] Contrôle avancé du clavier V2 corrigée :

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



Intelligide
Hors ligne
Membre de CreativeCalc
Niveau: Aucun
Points: 38
Défis: 5
Message
Dernier message de la page précédente :Posté le 09/01/2016 19:40 |
Ben, tu dl et tu testes

J'avais utilisé cette lib pour Fastar et elle fonctionne



Pages: Précédente | 1, 2, 3, 4

Lephenixnoir
En ligne
Administrateur
Niveau: Confirmé
Points: 10884
Défis: 130
Message
Citer : Posté le 09/01/2016 21:01 | #
Intelligide a écrit :
Ben, tu dl et tu testes

Moi-même, m'attendant déjà à des problèmes, a écrit :
Je ne peux pas tester actuellement [...]


Intelligide a écrit :
J'avais utilisé cette lib pour Fastar et elle fonctionne

Tu l'avais développé sous SH3 ou sous SH4 ?
----------------------------------
Watch me, as I build my empire with my own hands.
Kirafi
Hors ligne
Membre
Niveau: Confirmé
Points: 1999
Défis: 10
Message
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 .
void input_update()
{
    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;
        }

    }
}
----------------------------------
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
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)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (é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)
Ninestars
Hors ligne
Membre
Niveau: Confirmé
Points: 1877
Défis: 22
Message
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.
----------------------------------
Kirafi
Hors ligne
Membre
Niveau: Confirmé
Points: 1999
Défis: 10
Message
Citer : Posté le 10/01/2016 20:33 | #
Ouaip j'ai aussi changé ligne 13 et 14, ça marque nickel .
----------------------------------
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
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)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (é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)
Ninestars
Hors ligne
Membre
Niveau: Confirmé
Points: 1877
Défis: 22
Message
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.
----------------------------------
Kirafi
Hors ligne
Membre
Niveau: Confirmé
Points: 1999
Défis: 10
Message
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 :
if(input_press(76) && input_press(29) && input_press(31) && input_press(71)){...}
//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 .
----------------------------------
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
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)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (é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)
Ninestars
Hors ligne
Membre
Niveau: Confirmé
Points: 1877
Défis: 22
Message
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
----------------------------------
Kirafi
Hors ligne
Membre
Niveau: Confirmé
Points: 1999
Défis: 10
Message
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 .
----------------------------------
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
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)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (é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)
Ninestars
Hors ligne
Membre
Niveau: Confirmé
Points: 1877
Défis: 22
Message
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
----------------------------------
Kirafi
Hors ligne
Membre
Niveau: Confirmé
Points: 1999
Défis: 10
Message
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 .
----------------------------------
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
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)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (é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)
Dark storm
Hors ligne
Administrateur
Niveau: Aucun
Points: 10101
Défis: 170
Message
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
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Fife86
Hors ligne
Membre
Niveau: Confirmé
Points: 830
Défis: 0
Message
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
----------------------------------
It's Show Time !!!
Mes Jeux :
- Street Fighter : Pour les accrocs du free-fight.
- Kirby's DreamLand : Gobe , Gobe , Gobe !!!
- L'invasion Seanchans : Détruit la flotte ennemis a bord du "Danseur des vagues".


< Le recoin du C-Engine >
Lephenixnoir
En ligne
Administrateur
Niveau: Confirmé
Points: 10884
Défis: 130
Message
Citer : Posté le 12/01/2016 18:06 | #
Ninestars a écrit :
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...
----------------------------------
Watch me, as I build my empire with my own hands.
-florian66-
Hors ligne
Rédacteur
Niveau: Aucun
Points: 2262
Défis: 19
Message
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 )
----------------------------------
In Arch, I trust ! And you ?
Ninestars
Hors ligne
Membre
Niveau: Confirmé
Points: 1877
Défis: 22
Message
Citer : Posté le 13/01/2016 18:34 | #
Lephenixnoir a écrit :
vérifie la valeur de retour 0 avec le code valide !
C'est à dire ? Je n'ai pas compris.
Lephenixnoir a écrit :
C'est parce qu'il est complètement en bordure de la keymap...
C'est pas plutot la flèche qui est en bordure de la keymap ? Son numero est 25 alors que AC c'est 34.

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
----------------------------------
Lephenixnoir
En ligne
Administrateur
Niveau: Confirmé
Points: 10884
Défis: 130
Message
Citer : Posté le 14/01/2016 19:45 | #
Ninestars a écrit :
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.

Ninestars a écrit :
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.
----------------------------------
Watch me, as I build my empire with my own hands.

Pages: Précédente | 1, 2, 3, 4

Index du Forum | Vos tutoriels et astuces | [Librairie C] Contrôle avancé du clavier V2 corrigée

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2018 | Il y a 73 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Casio Education Casiopeia CodeWalrus

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd