Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum 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 Points: 2462 Défis: 24 Message

[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


1, 2, 3, 4 Suivante
-florian66- Hors ligne Ancien rédacteur Points: 2384 Défis: 20 Message

Citer : Posté le 30/08/2014 20:33 | #


cool On est obligé de tous le tyemps réactualiser le clavier ?
In Arch, I trust ! And you ?
Lephenixnoir En ligne Administrateur Points: 24572 Défis: 170 Message

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 ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

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" :)
Lephenixnoir En ligne Administrateur Points: 24572 Défis: 170 Message

Citer : Posté le 30/08/2014 20:45 | #


Donc tu gères tes impulsions via des données statiques / globales ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

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.
Lephenixnoir En ligne Administrateur Points: 24572 Défis: 170 Message

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 ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

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 !
Lephenixnoir En ligne Administrateur Points: 24572 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

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.
-florian66- Hors ligne Ancien rédacteur Points: 2384 Défis: 20 Message

Citer : Posté le 30/08/2014 21:31 | #


ah d'accord merci
In Arch, I trust ! And you ?
Ziqumu Hors ligne Membre d'honneur Points: 3055 Défis: 9 Message

Citer : Posté le 31/08/2014 01:09 | #


Keydown n'est pas compatible SH4 :/
Kirafi Hors ligne Membre Points: 2180 Défis: 10 Message

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
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)
Darkysun Hors ligne Membre Points: 1747 Défis: 52 Message

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

Si je ne réponds pas à un post depuis trop longtemps : envoyez-moi un message pour me le rappeler !




Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

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)?
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 31/08/2014 12:52 | #


Elle y est déjà, regarde mieux
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 31/08/2014 12:57 | #


laquelle? j'ai trouvé
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 01/09/2014 00:40 | #


Du coup key_down est compatible ?
C'est input_trigger() que tu cherchais Intelligide nan ?
Kirafi Hors ligne Membre Points: 2180 Défis: 10 Message

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 .
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)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 01/09/2014 19:46 | #


@ninestar oui, c'est ça

j'ai un problème quand je fait ça
        input_update();
        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
Lephenixnoir En ligne Administrateur Points: 24572 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
1, 2, 3, 4 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 244 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd