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

OpenGL Discussion :

[GLUT] Gestion clavier, touches concurentes


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 41
    Points
    41
    Par défaut [GLUT] Gestion clavier, touches concurentes
    Bonjour à tous,

    Actuellement, je fais quelque chose du style doom like, on bouge la caméra et on se déplace.

    Avec votre aide, je peux me déplacer en avant, en arrière, sur le coté, et tourner avec la souris ... ça va très bien .

    Cependant, mon prof m'a dit que :
    si on avance et qu'on appuis sur la touche flèche bas, il faut qu'on continue à avancer (actuellement, ça fait le mélange d'avancer et reculer, les vitesses étant les mêmes, on s'immobilise). Suivant ce conseil, j'ai utilisé une machine à état, avec des états pas à gauche, avancer, reculer, reculer+pas à droite, etc. et comment on peut passer de l'un à l'autre. Depuis que j'ai fait ceci, les déplacements ne sont plus aussi fluides.
    En effet, si je me déplace sur le coté gauche puis vers le droit, il y a un petit temps avant qu'on reparte vers le droite. Encore plus grave, de temps en temps, en combinant les touches, on ne se déplace pas comme il le faut.

    J'ai ensuite essayé tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!touches[TOUCHE_BAS]) touches[TOUCHE_HAUT] = 1;
    mais j'ai exactement les mêmes problèmes de fluidité lors des changement de déplacement.

    Ais-je la bonne méthode ? Voila, je fais appel à vous, demandant une méthode qui pourrait être plus appropriée.

  2. #2
    Membre averti Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Points : 332
    Points
    332
    Par défaut
    à mon avis il faut juste donner des priorités à t touches, il faut pas mettre des conditions bloquantes.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Cela me semble perso un peu bizarre... je ne vois pas pourquoi une machine d'état (surtout si elle est toute simple) devrait ralentir le fonctionnement... Tu es sur que tu n'as pas un problème directement là-dedans?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Donner des priorités à mes touches ? C'est à dire ?

    Je vous montre ce que j'avais fait pour la machine à états :

    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
     
    // Fonction callback appelée lorsqu'une touche spéciale est pressée
    GLvoid window_special_keypressed(int key, int x, int y)
    { 
      // changement d'état en fonction des touches pressées
      switch(key) 
      {
        case GLUT_KEY_UP:
          if(etatDeplacement == 0) etatDeplacement = 1;
    	  else if(etatDeplacement == 2) etatDeplacement = 5;
    	  else if(etatDeplacement == 3) etatDeplacement = 6;
    	  break;
        case GLUT_KEY_DOWN:
          if(etatDeplacement == 0) etatDeplacement = 4;
    	  else if(etatDeplacement == 2) etatDeplacement = 7;
    	  else if(etatDeplacement == 3) etatDeplacement = 8;
    	  break;
        case GLUT_KEY_LEFT:
          if(etatDeplacement == 0) etatDeplacement = 2;
    	  else if(etatDeplacement == 1) etatDeplacement = 5;
    	  else if(etatDeplacement == 4) etatDeplacement = 7;
    	  break;
        case GLUT_KEY_RIGHT:
          if(etatDeplacement == 0) etatDeplacement = 3;
    	  else if(etatDeplacement == 1) etatDeplacement = 6;
    	  else if(etatDeplacement == 4) etatDeplacement = 8;
    	  break;
      } 
    }
     
    GLvoid window_special_keyreleased(int key, int x, int y)
    {
      // changement d'état en fonction des touches relachées
      switch(key) 
      { 
        case GLUT_KEY_UP:
          if(etatDeplacement == 1) etatDeplacement = 0;
    	  else if(etatDeplacement == 5) etatDeplacement = 2;
    	  else if(etatDeplacement == 6) etatDeplacement = 3;
    	  break;
        case GLUT_KEY_DOWN:
          if(etatDeplacement == 4) etatDeplacement = 0;
    	  else if(etatDeplacement == 7) etatDeplacement = 2;
    	  else if(etatDeplacement == 8) etatDeplacement = 3;
    	  break;
        case GLUT_KEY_LEFT:
          if(etatDeplacement == 2) etatDeplacement = 0;
    	  else if(etatDeplacement == 5) etatDeplacement = 1;
    	  else if(etatDeplacement == 7) etatDeplacement = 4;
    	  break;
        case GLUT_KEY_RIGHT:
          if(etatDeplacement == 3) etatDeplacement = 0;
    	  else if(etatDeplacement == 6) etatDeplacement = 1;
    	  else if(etatDeplacement == 8) etatDeplacement = 4;
    	  break;
      } 
    }
    Et dans mon render scène, j'ai ç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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
      // ********************
      // gestion clavier en fonction de l'état
      switch(etatDeplacement) 
      { 
        // case 0 : rester sur place
        case 1:
    	  // avancer
          deplacementAvant();
    	  break;
        case 2:
    	  // pas à gauche
          deplacementPasGauche();
    	  break;
        case 3:
    	  // pas à droite
          deplacementPasDroit();
    	  break;
        case 4:
    	  // reculer
          deplacementArriere();
    	  break;
        case 5:
    	  // avancer + pas à gauche
          deplacementAvant();
          deplacementPasGauche();
    	  break;
        case 6:
    	  // avancer + pas à droite
          deplacementAvant();
          deplacementPasDroit();
    	  break;
        case 7:
    	  // reculer + pas à gauche
          deplacementArriere();
          deplacementPasGauche();
    	  break;
        case 8:
    	  // reculer + pas à droite
          deplacementArriere();
          deplacementPasDroit();
    	  break;
      }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Up

  6. #6
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    un truc tout simple : gerer les prioritée avec des if{}else if{}

    par exemple pour avancer sa donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (touche[avancer]){
        // code qui fait avancer
    }else if(touche[reculer]){
        // code qui fait reculer
    }
    comme ca le test pour savoir si tu doit reculer n'est affectuer que si tu n'avance pas.
    par contre si jamais tu etait en train de reculer et que tu appuie sur la touche avancer, tu vas te mettre à avancer...

  7. #7
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    un truc tout simple : gerer les prioritée avec des if{}else if{}

    par exemple pour avancer sa donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (touche[avancer]){
        // code qui fait avancer
    }else if(touche[reculer]){
        // code qui fait reculer
    }
    comme ca le test pour savoir si tu doit reculer n'est affectuer que si tu n'avance pas.
    par contre si jamais tu etait en train de reculer et que tu appuie sur la touche avancer, tu vas te mettre à avancer...

    d'ailleurs je ne croit pas qu'un systeme de priorité soit réelement ce dont tu a besoin, car quel que soit le systeme que tu met en place tu aura toujours ce probleme de touche de prioritée superieure qui viendra changer l'actio en cours.

    en fait a mon avis tu doit plutot avoir une gestion de touches concurrentes genre avancer et reculer ne peuvent pas agir en même temps, par exemple avec une variable tierce qui peut prendre 3 etats permettant de savoir si tu avance, tu recule ou tu ne bouge pas. lors d'un appuie de touche tu regarde le valeure de la variable tierce, si elle signal un mouvement tu ne fait rien, sinon tu la met a la valeure voulu (avancer/reculer). et lors de la relache, tu la met soit a arret si la touche concurrente n'est pas appuyée, soit a la valeure voulu.

    enfin bref j'espere avoir été assez claire et j'en ai marre d'ecrire

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Je te mercie, mais je n'arrive toujours pas à quelque chose de concluant .

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 108
    Points : 128
    Points
    128
    Par défaut
    La priorité doit être dynamique. Essaye sous l'explorateur Windows.

    Si tu appuis sur bas -> sa scroll vers le bas.
    Si tu appuis sur haut alors que bas est toujours appuyé -> sa scroll vers le haut

    Et inversement...

    Pour faire ça, il faut définir les déplacements qui sont concurrents.
    Ici : haut et bas.
    Pour réaliser cet effet, il faut que ce soit la dernière touche appuyée qui soit prioritaire. Pour savoir ça, il faut sauvegarder l'état précédent (haut, bas ou rien) et l'utiliser dans tes tests pour déterminer le déplacement à effectuer.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Merci ! Avec cette technique, ça marche enfin . C'était pas compliqué en fait .

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

Discussions similaires

  1. [Débutant] Gestion des touches du clavier
    Par krolis dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/07/2012, 12h39
  2. Gestion des touches clavier
    Par new_wave dans le forum Débuter
    Réponses: 2
    Dernier message: 15/04/2012, 01h09
  3. gestion des touches du clavier
    Par ines1 dans le forum C++
    Réponses: 5
    Dernier message: 27/01/2007, 21h37
  4. [SDL] Gestion des touches claviers problématique
    Par Invité4 dans le forum SDL
    Réponses: 3
    Dernier message: 13/10/2006, 22h15
  5. Gestion des touches clavier
    Par bourinator dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 18/06/2006, 17h19

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