IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Detecter l'enfoncement d'une touche [FAQ]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut Detecter l'enfoncement d'une touche
    Bonjour,

    voilà je dois créer un jeu et pour cela j'ai à detecter l'enfoncement de touches du clavier.

    je ne veut pas faire de scanf car il faut que le programme continue de tourner.

    j'ai trouvé ce code dans la FAQ qui à l'air de bien correspondre à ce que je cherche mais j'avoue avoir quelques soucis pour l'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <conio.h>
     
    int main(void)
    {
       int touche;
     
       for (;;)
       {
          touche = -1;   /* pas de touche */
     
          if (kbhit())
          {
             /* Si présence d'une touche... */
             touche = getch() ;    /* ... la lire */
             if (touche == 0)
             {
                /* Si touche double code... */
                touche = getch() ;  /* ... la lire */
     
                switch(touche)      /* ... et effectuer le traitement */
                {
                   case FLG:     /* Fleche Gauche (0x4B) */
                     // Traîtement
                     break ;
                   case FLD:     /* Fleche Droite (0x4D) */
                     // Traîtement
                     break ;
                   case FLH:     /* Fleche Haute (0x48) */
                     // Traîtement
                     break ;
                   case FLB:     /* Fleche Basse (0x50) */
                     // Traîtement
                     break ;
                } ;
             }
             else
             {
                if (c == ESC)  /* test de sortie */
                   break;
     
                switch(touche)
                {
                   case '1' :
                      // Traîtement
                      break ;
                   case '2' :
                      // Traîtement
                      break ;
                   case '3' :
                      // Traîtement
                      break ;
                } ;
             }
          }
          /* Ici votre programme... */
       }
       return 0;
    }
    premièrement en faisant un simple copier coller et en compilant j'ai plusieurs erreurs.
    il me dit qu'il ne connait pas FLG dans la ligne " case FLG: " ce qui est normal... je suppose donc que j'ai à remplacer par " case :0x4B " ? (oui/non?)
    de meme pour les autres touches.


    ensuite cette ligne là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (c == ESC)  /* test de sortie */
    c'est par exemple si l'utilisateur veut quitter le programme on detecter s'il enfonce la touche esc? (je dois donc aussi remplacer ESC par son code comme pour les fleches je suppose?)

    enfin que fait cette ligne?

    c'est une boucle for infinie?

    voilà déjà les réponses à ces premieres questions m'eclaiciront bien (et je reviendrais avec d'autres )

    merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    hop me revoilà,

    alors pour le for( ; ; ) c'est bon

    et pour les tests aussi !

    j'aurais juste une question :

    comment je récupère le 'code' de touches? (exemple /* Fleche Gauche (0x4B) */)

    car en fait là ce nombre correspond à la flèche gauche mais du pavé numérique et non la flèche gauche (du clavier? je sais pas si elle a un nom spécial) et je cherche aussi à récupérer le numéro de la touche 'B'

    merci d'avance

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Elstak
    comment je récupère le 'code' de touches? (exemple /* Fleche Gauche (0x4B) */)

    car en fait là ce nombre correspond à la flèche gauche mais du pavé numérique et non la flèche gauche (du clavier? je sais pas si elle a un nom spécial)
    J'ai corrigé le code.

    et je cherche aussi à récupérer le numéro de la touche 'B'
    C'est 'B', tout simplement. En fait getch() ne renvoi pas un 'numéro de touche', mais la valeur du caractère correspondant selon le jeu de caractères en vigueur. (Attention, sous Windows, les caractères > 127, accentuées etc. ne sont pas les mêmes dans l'éditeur graphique et dans la console).

    Petite expérience à compléter à l'aide des éléments du code précédent (correction) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int main (void)
    {
       int c;
       while ((c = getch ()) != ESC)
       {
          if (isprint (c))
          {
             cprintf ("c = %d '%c'" EOL, c, c);
          }
          else
          {
             cprintf ("c = %d" EOL, c);
          }
       }
       return 0;
    }
    Tu verras que quand on tape sur des touches spéciales, 2 codes sont lus au lieu d'un. Le premier code est apelé code d'extension. Sous DOS c'est 0. Sous Windows (CONIO/MinGW), c'est 0 ou 224 selon les touches...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    ok, merci beaucoup !

    mais je vais utiliser un bibliotheque graphique que tu dois surement connaitre (SDL) pour laquelle il y a des fonctions prévues spécialement pour ca et plein d'autre truc dont j'ai besoin donc je vais pas me casser la tete

    sinon j'avais testé ton code et tout va bien !

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Elstak
    voilà je dois créer un jeu et pour cela j'ai à detecter l'enfoncement de touches du clavier.

    je ne veut pas faire de scanf car il faut que le programme continue de tourner.

    j'ai trouvé ce code dans la FAQ qui à l'air de bien correspondre à ce que je cherche mais j'avoue avoir quelques soucis pour l'utiliser

    premièrement en faisant un simple copier coller et en compilant j'ai plusieurs erreurs.
    Ce code est buggé. Voici une version corrigée et portable DOS/Windows (MinGW)....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #ifdef WIN32
    #include <conio2.h>
    #define EXT 224
    #else
    #include <conio.h>
    #define EXT 0
    #endif
     
    #define EOL "\n\r"
     
    enum
    {
       ESC = 27,
     
       FLG = 0x4B,                  /* Fleche Gauche  */
       FLD = 0x4D,                  /* Fleche Droite  */
       FLH = 0x48,                  /* Fleche Haute  */
       FLB = 0x50,                  /* Fleche Basse  */
       dummy
    };
     
    int main (void)
    {
       int touche;
       for (;;)
       {
          touche = -1;              /* pas de touche */
          if (kbhit ())
          {                         /* Si présence d'une touche... */
             touche = getch ();     /* ... la lire */
             if (touche == EXT)
             {
                if (kbhit ())       /* Si touche double code... */
                {
                   touche = getch (); /* ... la lire */
                   switch (touche)  /* ... et effectuer le traitement */
                   {
                   case FLG:
                      /* Traîtement */
                      cputs ("LEFT" EOL);
                      break;
                   case FLD:
                      /* Traîtement */
                      cputs ("RIGHT" EOL);
                      break;
                   case FLH:
                      /* Traîtement */
                      cputs ("UP" EOL);
                      break;
                   case FLB:
                      /* Traîtement */
                      cputs ("DOWN" EOL);
                      break;
                   }                /* ; -ed- : supression */
                }
                else
                {
                   cprintf ("touche = %d" EOL, touche);
                }
             }
             else
             {
                if (touche == ESC)  /* test de sortie */
                   break;
                switch (touche)
                {
                case '1':
                   /* Traîtement */
                   break;
                case '2':
                   /* Traîtement */
                   break;
                case '3':
                   /* Traîtement */
                   break;
                }                   /* ; -ed- : supression */
             }
          }                         
          /* Ici votre programme... */
       }
       return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. detecter le double "appuie" d'une touche clavier
    Par jadey dans le forum Flash
    Réponses: 4
    Dernier message: 25/03/2007, 01h43
  2. Réponses: 2
    Dernier message: 16/05/2006, 23h57
  3. detecter une touche du clavier
    Par Hypnocrate dans le forum C
    Réponses: 20
    Dernier message: 02/05/2006, 17h58
  4. [Forms 9] Detection de la pression d'une touche
    Par kervoaz dans le forum Forms
    Réponses: 3
    Dernier message: 24/04/2006, 10h02
  5. Substitution de caractères quand on enfonce une touche
    Par Dionyzos dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/06/2004, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo