Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » [Librairie C] Contrôle avancé du clavier V2 corrigée
NinestarsHors ligneMembrePoints: 2247 Défis: 22 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


Pages : Précédente1, 2, 3, 4Suivante
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

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.
NinestarsHors ligneMembrePoints: 2247 Défis: 22 Message

Citer : Posté le 07/09/2014 22:22 | #


~current_key pareil que !current_key
OK merci
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

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.
NinestarsHors ligneMembrePoints: 2247 Défis: 22 Message

Citer : Posté le 07/09/2014 22:24 | #


Ah oui c'est pas pareil du coup !
LimachiHors ligneYoutuberPoints: 2798 Défis: 67 Message

Citer : Posté le 08/09/2014 06:16 | #


Eiyeron a écrit :
Et si tu veux la version crade :

current_key[i] += key_down(i) ? (current_key[i] < 255 ? 1 : 0) : ~current_key[i];
//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
Mes Programmes
Cliquer pour enrouler
-en basic: un programme nommé PICFMLIM convertissant une picture en code basic.
-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


Projets et Programmes que je soutiens (sur une idée de Marmotti)
Cliquer pour enrouler
-Pokemon Jade de Dodormeur
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
LephenixnoirHors ligneAdministrateurPoints: 15483 Défis: 136 Message

Citer : Posté le 08/09/2014 06:41 | #


Eiyeron a écrit :
Et si tu veux la version crade :

current_key[i] += key_down(i) ? (current_key[i] < 255 ? 1 : 0) : ~current_key[i];
//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à

LIMachi a écrit :
? ^ ~ | & : les dieux de l'optimisation et de la destruction de neurones a la relecture XD

Je plussoie littéralement cette remarque si pertinente.
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

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!
LephenixnoirHors ligneAdministrateurPoints: 15483 Défis: 136 Message

Citer : Posté le 08/09/2014 12:33 | #


Un bon langage de programmation est plus puissant si le code est illisible.

C'est pour ça que j'aime l'Assembleur.

[/HS]
NinestarsHors ligneMembrePoints: 2247 Défis: 22 Message

Citer : Posté le 08/09/2014 18:10 | #


C'est bon j'ai corrigé ce qui n'allait pas
IntelligideHors ligneMembre de CreativeCalcPoints: 46 Défis: 5 Message

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


        ToucheSHIFT=input_press(K_SHIFT);
        ToucheALPHA=input_trigger(K_ALPHA);


ne fonctionne toujours pas
NinestarsHors ligneMembrePoints: 2247 Défis: 22 Message

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
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

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
    savevalue = *(unsigned int*)A400 0114
    *(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:
int isSH3() {
    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 char key_down(unsigned char code)
{
    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.
NinestarsHors ligneMembrePoints: 2247 Défis: 22 Message

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
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

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.
IntelligideHors ligneMembre de CreativeCalcPoints: 46 Défis: 5 Message

Citer : Posté le 28/10/2014 15:14 | #


Les touches F1 et F2 ne fonctionnent pas
KirafiHors ligneMembrePoints: 2104 Défis: 10 Message

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

Voilà ce que ça m'affiche
ça vous dit quelque chose ?
Executing Hitachi SH C/C++ Compiler/Assembler phase

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 !
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)
Fife86Hors ligneMembrePoints: 830 Défis: 0 Message

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.
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 >
KirafiHors ligneMembrePoints: 2104 Défis: 10 Message

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 .
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)
Fife86Hors ligneMembrePoints: 830 Défis: 0 Message

Citer : Posté le 07/01/2016 20:02 | #


De rien. J'ai hâte que ton jeu sort.
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 >
LephenixnoirHors ligneAdministrateurPoints: 15483 Défis: 136 Message

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 ?
IntelligideHors ligneMembre de CreativeCalcPoints: 46 Défis: 5 Message

Citer : 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édente1, 2, 3, 4Suivante

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 40 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