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 :

flèches du clavier et séquence d'echappement


Sujet :

C++

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut flèches du clavier et séquence d'echappement
    Bonjour,

    il me semble que les séquences d'échappement des flèches soient les suivantes:
    haut: "^[[A"
    bas: "^[[B"
    gauche: "^[[D"
    droite: "^[[C"

    quelqu'un sait-il si ces séquence d'échappements sont bonnes et quel code il faut pour que l'appuie sur une flèche soit suffisant pour copier cette séquence vers une variable?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 136
    Points : 12 235
    Points
    12 235
    Par défaut
    Ça dépend du système, de comment il est configuré, voir du protocole réseau, si c'est un accès distant.
    C'est quoi le "problème original" ?

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    merci d'avoir répondu

    système Linux, utf-8, local, déplacer un caractère en mode texte

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    j'ai oublié de dire que c'est une variable dans un programme en c++

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 291
    Points : 1 889
    Points
    1 889
    Par défaut
    Salut,

    Il n'est pas possible de détecter les frappes au clavier de façon standard.
    Il va te falloir passer par une librairie externe.

    A ma connaissance, SFML propose quelque chose, mais c'est peut être overkill pour ton besoin.
    Peut-être trouveras-tu ton bonheur ici: https://en.cppreference.com/w/cpp/links/libs

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    J'ai trouvé ça je ne sais plus où. À cette époque, on utilisait encore using namespace std.
    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
    #include <unistd.h>
    #include <termios.h>
    #include <cstdio>
    #include <iostream>
    #include <limits>
    using namespace std;
     
     
    char getch() {
      char buf = 0;
      struct termios old = {0};
      if (tcgetattr(0, &old) < 0)
        perror("tcsetattr()");
      old.c_lflag &= ~ICANON;
      old.c_lflag &= ~ECHO;
      old.c_cc[VMIN] = 1;
      old.c_cc[VTIME] = 0;
      if (tcsetattr(0, TCSANOW, &old) < 0)
        perror("tcsetattr ICANON");
      if (read(0, &buf, 1) < 0)
        perror ("read()");
      old.c_lflag |= ICANON;
      old.c_lflag |= ECHO;
      if (tcsetattr(0, TCSADRAIN, &old) < 0)
        perror ("tcsetattr ~ICANON");
      return (buf);
    }
    en utilisant ce getch, je m'en suis sorti comme ça:
    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
    #include <iostream>
     
    char getch();
     
    int main(){
      while(true){
        int c;
        c=getch();
        if(c==27){
          c=getch();
          if(c==91){
    	c=getch();
    	switch(c){
    	case 65:
    	  std::cout<<"haut"<<std::endl;
    	  break;
    	case 66:
    	  std::cout<<"bas"<<std::endl;
    	  break;
    	case 67:
    	  std::cout<<"droite"<<std::endl;
    	  break;
    	case 68:
    	  std::cout<<"gauche"<<std::endl;
    	}
          }
        }
      }
    }
    quelqu'un pourrait-il réécrire getch avec les std aux bons endroits?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 125
    Points : 33 029
    Points
    33 029
    Billets dans le blog
    4
    Par défaut
    Typiquement le genre de trucs très hacky en consoles et qui prend quelques lignes avec une vraie fenêtre comme SFML pourrait fournir.
    quelqu'un pourrait-il réécrire getch avec les std aux bons endroits?
    Tu supprimes using namespace std; et corriges les erreurs de compilation.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Typiquement le genre de trucs très hacky en consoles et qui prend quelques lignes avec une vraie fenêtre comme SFML pourrait fournir.
    désolé, je ne connais pas encore, mais ça va venir, la programmation évènementielle.

    on peut supprimer usign..., apparemment on en a pas besoin.

    sujet résolu

  9. #9
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 743
    Points : 3 645
    Points
    3 645
    Par défaut
    Citation Envoyé par emmesse Voir le message
    il me semble que les séquences d'échappement des flèches soient les suivantes:
    haut: "^[[A"
    bas: "^[[B"
    gauche: "^[[D"
    droite: "^[[C"
    Les séquences ici représentent ce qui est affiché, pas les valeurs réellement utilisées. ^[ représente le caractère d'échappement (0x1b) qui est un caractère invisible. D'ailleurs, toutes les séquences de commande commence par ce caractère (que se soit les inputs clavier/souris ou celle interprétés par le terminal). Donc "haut" correspond à "\x1b[D". Le mieux est d'utiliser showkey -a pour visualiser correctement les séquences.

    La bibliothèque standard ne fournit aucune facilité car elle est agnostique au système. Les séquences ANSI comme ici viennent essentiellement du monde UNIX.

    Au passage, enlever / remettre en boucle le mode canonique comme le fait getch n'est pas terrible. Il faudrait plutôt l'enlever quand il y en a besoin et le remettre ensuite. Sinon, en général, quand on fait une TUI, on passe par des bibliothèques comme ncurses ou pdcurses.

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    oui, j'avais remarqué pour les séquence. J'utilise la séquence 27,91,65 pour haut; 27,91,66 pour bas; 27,91,68 pour gauche et 27,91,67pour droite.
    Je ne connaissais pas pdcurses, je verrais si il y a un tuto pour ça et je me documenterais.
    Je ne connais absolument rien sur ce getch, j'ai trouvé ça sur internet il y a longtemps, je ne sais pas comment il fonctionne.
    Merci pour showkey -a, c'est super!

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 881
    Points : 219 325
    Points
    219 325
    Billets dans le blog
    123
    Par défaut
    Bonjour,

    Je rejoins emmesse, il faut passer en mode brut : https://c.developpez.com/faq/?page=G...mode-brut-UNIX
    Sinon, il y a ncurses (pdcurses, c'est le portage pour Windows). Mais, ça permet de faire des choses plus jolis (ncurses, c'est les interfaces avec des cadres et une interface utilisateur, tout dans le terminal).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    merci LittleWhite de me rejoindre

    c'est pas du C tout ça?

    il existe ncurses pour c++?

    que pensez-vous de SDL2?

  13. #13
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 612
    Points : 1 368
    Points
    1 368
    Par défaut
    Salut,

    Citation Envoyé par LittleWhite Voir le message
    Sinon, il y a ncurses (pdcurses, c'est le portage pour Windows)
    Pour info, ncurses fonctionne très bien sous Windows.

  14. #14
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    y a-t-il la même chose pour le C++?

  15. #15
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 612
    Points : 1 368
    Points
    1 368
    Par défaut
    Oui, pour ncurses, dans un des sous-dossiers, il y a un wrapper c++.

  16. #16
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    excuse-moi de continuer, mais as-tu une URL?

  17. #17
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 612
    Points : 1 368
    Points
    1 368

  18. #18
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    cool, ça a bien compilé
    j'ai utlisé DESTDIR=... pour faire un paquet car c'est plus propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ configure --with-cxx --prefix /usr
    $ make
    $ make DESTDIR=/un/chemin install
    $ ls /un/chemin
    usr

  19. #19
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 612
    Points : 1 368
    Points
    1 368
    Par défaut
    Je ne sais pas ce que tu cherches à faire exactement, ce lien peut être utile https://viewsourcecode.org/snaptoken...ngRawMode.html , et il y a pas mal de Libs très légères sur GitHub qui ne font que de la capture (raw input).

  20. #20
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    le but final est de générer un labyrinthe, permettre d'y jouer et indiquer la solution. Je connais l'un des algorithmes pour en générer, je l'ai déjà fait en C, maintenant je voudrais le faire en C++.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Turbo Pascal] Entrée au clavier sous forme ******
    Par Upal dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 15/02/2003, 14h42
  2. [TP]vider le tampon clavier
    Par kael kael dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 11/01/2003, 22h19
  3. Clavier Azerty
    Par Smortex dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 16/12/2002, 20h33
  4. Cherche Nom des touches du clavier
    Par juan64 dans le forum C++Builder
    Réponses: 8
    Dernier message: 23/07/2002, 19h11
  5. Vider le buffer du clavier
    Par flavien tetart dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 12/07/2002, 08h35

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