[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 07/09/2014 22:19 | #
~integer == not binaire
Et ++nombre == nombre += 1 à la différence près que
int a = 5;
tableau[++a] // va fetcher tableau[6]
printf("%d", a); // va afficher 6
n'est pas la même chose que
int a = 5;
tableau[a++] // va fetcher tableau[5]
printf("%d", a); // va afficher 6
++nombre s'execute généralement avant l'instruction suivante alors que nombre++ le fait après.
Citer : Posté le 07/09/2014 22:22 | #
~current_key pareil que !current_key
OK merci
Citer : Posté le 07/09/2014 22:23 | #
Stooop, nan, pas du tout, !variable revient à faire (variable == 0)
~variable inverse chaque bit de la variable.
Citer : Posté le 07/09/2014 22:24 | #
Ah oui c'est pas pareil du coup !
Citer : Posté le 08/09/2014 06:16 | #
Et si tu veux la version crade :
//version alternative
current_key[i] = key_down(i) ? (current_key[i] < 255 ? current_key[i]+1 : 255) : 0;
// tiens j'ai une idée à la con
// current_key ^ 255 ? current_key[i]++ : 255; // En gros, !(a xor b) revient à faire a == b
current_key[i] = key_down(i) ? (current_key[i] ^ 255 ? current_key[i]+1 : 255) : 0; // ~ est inutilisable dans le cas ou current_key[i] == 0
Bon, j'vais arrêter là, j'aime bien tripatouiller avec les opérateurs bizarres (trop d'Axe Parser...)
coopaain
? ^ ~ | & : les dieux de l'optimisation et de la destruction de neurones a la relecture XD
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 08/09/2014 06:41 | #
Et si tu veux la version crade :
//version alternative
current_key[i] = key_down(i) ? (current_key[i] < 255 ? current_key[i]+1 : 255) : 0;
// tiens j'ai une idée à la con
// current_key ^ 255 ? current_key[i]++ : 255; // En gros, !(a xor b) revient à faire a == b
current_key[i] = key_down(i) ? (current_key[i] ^ 255 ? current_key[i]+1 : 255) : 0; // ~ est inutilisable dans le cas ou current_key[i] == 0
Bon, j'vais arrêter là, j'aime bien tripatouiller avec les opérateurs bizarres (trop d'Axe Parser...)
Nan mais faut plus faire du C dans ce cas-là
? ^ ~ | & : les dieux de l'optimisation et de la destruction de neurones a la relecture XD
Je plussoie littéralement cette remarque si pertinente.
Citer : Posté le 08/09/2014 08:19 | #
À ton Avis, pourquoi j'aime l'Axe Parser? Tu peux faire des trucs carrément illisibles et ça marche meixu que la version compréhensible!
Citer : Posté le 08/09/2014 12:33 | #
C'est pour ça que j'aime l'Assembleur.
Citer : Posté le 08/09/2014 18:10 | #
C'est bon j'ai corrigé ce qui n'allait pas
Citer : Posté le 08/09/2014 20:30 | #
ToucheALPHA=input_trigger(K_ALPHA);
ne fonctionne toujours pas
Citer : Posté le 08/09/2014 22:10 | #
Oh mon dieu, erreur pourrie, dans input.c corrige ligne 20 : i<54 !!
Désolé
Ajouté le 08/09/2014 à 22:12 :
Là c'est bon, tout doit bien fonctionner
Citer : Posté le 09/09/2014 21:26 | #
Merci beaucoup, ça m'arrange pas mal que tu publies cette lib. J'ai bien quelques porpositions à part celles que j'ai déjà faites mais considère ta lib comme déjà utilisée.
Ajouté le 09/09/2014 à 22:25 :
Ne marche pas sur ma G35+USB SH3.
Ajouté le 09/09/2014 à 23:00 :
La détection de version de l'OS est incorrecte, elle se base sur un fait aujourd'hui faux que seuls les SH4 avaient un OS >= 2.02 ou un truc de ce genre, désormais ce n'est plus le cas, j'ai un OS 2.04. Faut se trouver un meilleur moyen de détecter les os.
SimLo a ici une routine qui permet de savoir sur quel proco on tourne
*(unsigned int*)A400 0114 = 0xFFFF
testvalue = *(unsigned int*)A400 0114
*(unsigned int*)A400 0114 = savevalue
MPU = UNKNOWN;
switch ( testvalue ){
case 0x00FF :
MPU = SH7337;
break;
case 0x0FFF :
MPU = SH7355;
break;
default :
switch ( *(unsigned int*)0xFF000030 & 0xFFFFFF00 ){
case 0x10300B00 :
switch ( *(unsigned int*)0xFF000044 & 0xFFFFFFF0 ){
case 0x00002C00 :
MPU = SH7305;
break;
case 0x00002200 : // just for reference
MPU = SH7724;
break;
};
break;
}
break;
}
- SH7305 is Fx9860GII SH4
- SH7337 is Fx9860G SH3
- SH7355 is Fx9860GII SH3
Ajouté le 09/09/2014 à 23:00 :
origine : http://www.casiopeia.net/forum/viewtopic.php?f=25&t=1651
Ajouté le 09/09/2014 à 23:08 :
Evidemment, cette routine subit une exception sur le SDK...
Ajouté le 09/09/2014 à 23:14 :
BOn, j'ai un fix assez crade mais à vérifier de plus près:
unsigned int savevalue = *(unsigned int*)0xA4000114;
unsigned int testvalue;
*(unsigned int*)0xA4000114 = 0xFFFF;
testvalue = *(unsigned int*)0xA4000114;
*(unsigned int*)0xA4000114 = savevalue;
switch ( testvalue ) {
case 0x00FF :
//MPU = SH7337;
return 1;
break;
case 0x0FFF :
//MPU = SH7355;
return 1;
break;
default :
switch ( *(unsigned int*)0xFF000030 & 0xFFFFFF00 ) {
case 0x10300B00 :
switch ( *(unsigned int*)0xFF000044 & 0xFFFFFFF0 ) {
case 0x00002C00 :
//MPU = SH7305;
return 0;
break;
case 0x00002200 : // just for reference
//MPU = SH7724;
return 0;
break;
};
break;
}
break;
}
}
{
unsigned short key[8];
const unsigned short* keyboardregister = (unsigned short*)0xA44B0000;
if(isOS2 && isSH3())
{
unsigned char row = code%10;
memcpy(&key, keyboardregister, sizeof(unsigned short) << 3);
return (0 != (key[row >> 1] & 1 << code / 10 - 1 + ((row & 1) << 3)));
}
else
{
return CheckKeyRow((code % 10) + ((code / 10 - 1) << 4));
}
}
Ajouté le 09/09/2014 à 23:14 :
Et çà marche sur l'ému cette fois.
Citer : Posté le 09/09/2014 23:14 | #
Ils font chier avec leur SH4 sérieux... J'ai repris le code de Dodormeur (enfin c'est lui qu'il m'avait donné) je n'y connais rien là dessus :/ Et je n'y comprends rien nonplus
Citer : Posté le 09/09/2014 23:15 | #
Bah en gros t'as zappé un gros détail (que plus ou moins tout le monde aussi) : les os 2.04 sont sortis aussi bien pour les SH3 que les SH4 et ça fausse le vieux test OS >= 2.02. Faut tester l'architecture mais ma méthode (ou plutôt cette de Simlo) fait aussi planter l'émulateur (et paraît fausse), enfin. Faut que je teste.
Citer : Posté le 28/10/2014 15:14 | #
Les touches F1 et F2 ne fonctionnent pas
Citer : Posté le 06/01/2016 23:16 | #
Hop hop hop , j'ai téléchargé mais quand je l'ajoute au projet et que je l'inclue dans mon code (sans les #include... seulement dans le projet) ça ne fonctionne pas
set SHC_INC=C:\CASIO\SDK\OS\SH\include
set PATH=C:\CASIO\SDK\OS\SH\bin
set SHC_LIB=C:\CASIO\SDK\OS\SH\bin
set SHC_TMP=C:\Users\Kirafi\Desktop\iCrew\Debug
WARNING: The following dependant file(s) do not exist: "memory.h" "MonochromeLib.h" "Dessin.h" "Generation.h" "Jeu.h" "usefull.h" "input.h". Line: 92
WARNING: The following dependant file(s) do not exist: "memory.h" "MonochromeLib.h" "Dessin.h" "Generation.h" "Jeu.h" "usefull.h" "input.h". Line: 109
WARNING: The following dependant file(s) do not exist: "memory.h" "MonochromeLib.h" "Dessin.h" "Generation.h" "Jeu.h" "usefull.h" "input.h". Line: 126
WARNING: The following dependant file(s) do not exist: "memory.h" "MonochromeLib.h" "Dessin.h" "Generation.h" "Jeu.h" "usefull.h" "input.h". Line: 143
WARNING: The following dependant file(s) do not exist: "memory.h" "MonochromeLib.h" "Dessin.h" "Generation.h" "Jeu.h" "usefull.h" "input.h". Line: 160
WARNING: The following dependant file(s) do not exist: "memory.h" "MonochromeLib.h" "Dessin.h" "Generation.h" "Jeu.h" "usefull.h" "input.h". Line: 177
WARNING: The following dependant file(s) do not exist: "memory.h" "MonochromeLib.h" "Dessin.h" "Generation.h" "Jeu.h" "usefull.h" "input.h". Line: 194
WARNING: The following dependant file(s) do not exist: "memory.h" "MonochromeLib.h" "Dessin.h" "Generation.h" "Jeu.h" "usefull.h" "input.h". Line: 211
Executing Hitachi OptLinker04 phase
"C:\CASIO\SDK\OS\SH\bin\Optlnk.exe" -subcommand=C:\Users\Kirafi\AppData\Local\Temp\hmk374D.tmp
** L2300 (E) Duplicate symbol "_OSVersionAsInt" in "C:\Users\Kirafi\Desktop\iCrew\Debug\usefull.obj"
Optimizing Linkage Editor Abort
HMAKE MAKE UTILITY Ver. 1.1
Copyright (C) Hitachi Micro Systems Europe Ltd. 1998
Copyright (C) Hitachi Ltd. 1998
ERROR: Process failed with return code: 1
Build was not successful.
Si quelqu'un a une idée pour m'aider à pouvoir utiliser cette librairie géniale ce serait cool , que je commence à coder avec ces fonctions directement parce qu'elle sont assez cool !
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 07/01/2016 08:40 | #
Il ne te sert a rien d'inclure les .h dans le Sdk, sa va déjà enlever les warning. Pour ce qui est du problème, la fonction _OSVersionAsInt est en double, elle se trouve dans 2 fichiers, il faut donc que tu en supprime une.
- Kirby's DreamLand : Gobe , Gobe , Gobe !!!
- L'invasion Seanchans : Détruit la flotte ennemis a bord du "Danseur des vagues".
Citer : Posté le 07/01/2016 18:59 | #
Ouai j'avais une idée comme ça mais je voulais éviter de trafiquer les .c avant de demander , enfin, c'est bon j'ai enlever toute la dernière partie de la lib (celle qui concerne la OSVersion...) et maintenant ça fonctionne !
Merci Fife .
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 07/01/2016 20:02 | #
De rien. J'ai hâte que ton jeu sort.
- Kirby's DreamLand : Gobe , Gobe , Gobe !!!
- L'invasion Seanchans : Détruit la flotte ennemis a bord du "Danseur des vagues".
Citer : Posté le 09/01/2016 13:40 | #
Tiens, je me rends compte que t'as utilisé la technique de lecture de SimLo, Ninestars.
Je ne peux pas tester actuellement, est-ce que quelqu'un ayant expérimenté cette lib pourrait me dire rapidement s'il a eu ou non des problèmes, et le type de machine utilisée ?
Citer : Posté le 09/01/2016 19:40 | #
Ben, tu dl et tu testes
J'avais utilisé cette lib pour Fastar et elle fonctionne