RepeatKeys sous OpenGL
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

RepeatKeys sous OpenGL



  1. #1
    Needer

    RepeatKeys sous OpenGL


    ------

    Bonjour à tous,

    Je suis actuellement en pleine réalisation d'un projet sous OpenGL et je me heurte à un problème ennuyant.

    Le projet consiste en une simulation qui évolue au cours du temps, et j'aimerais faire un petit morceau de code qui permet d'arrêter la simulation lorsqu'on appuie sur P (une pause, somme toute).

    Le code marche parfaitement (j'incrémente un compteur qui agit sur la partie du code qui régit l'évolution de la simulation), toutefois, il faut quasiment tout le temps que j'appuie 3 ou 4 fois sur cette touche P pour que cela marche. Je me suis rendu compte que c'était dû au fait que la répétition de touches est beaucoup trop rapide (presque instantanée) ; autrement dit quand j'appuie sur la touche P, la répétition de touche commence aussitôt.

    N'ayant rien trouvé de concluant sur google, je viens vous demander de l'aide.

    Est-il possible de modifier le temps avant la répétition de touches, ou, le cas échéant, de désactiver cette répétition de touche ?

    Merci de votre aide,

    Needer.

    -----

  2. #2
    invited9b9018b

    Re : RepeatKeys sous OpenGL

    Bonsoir,

    Une idée comme ça (peut être pas la meilleure) :
    Stocker l'état de chaque touche (pressed = true ou false) dans un tableau. Quand tu détectes l'évènement d'appui sur une touche, tu ne lanceras l'action associée que si la touche n'était pas encore appuyée, puis tu mets à jour l'état de ta touche dans le tableau.

    En gros ça donnerait :
    Code:
    // déclaration du tableau contenant les états de chaque touche
    // on peut bien sur envisager un tableau d'objets dérivés d'une classe "Key", pour stocker davantage d'informations, mais il s'agit juste d'un exemple
    bool pressed[SDLK_LAST];
    
    // initialisation du tableau
    void init()
    {
        for(int i = 0; i < SDLK_LAST; ++i) pressed[i] = false;
    }
    
    // Dans le code de détection des évènements :
    // [...]
    
    // une touche est appuyée :
    case SDL_KEYDOWN:
    {
        if(!pressed[event.key.keysym.sym])
        {
            // si la touche était libre jusqu'à maintenant, on effectue l'action associée
        }
        pressed[event.key.keysym.sym] = true; // on met à jour l'état de la touche
    }
    break;
    
    // une touche est relâchée
    case SDL_KEYUP
    {
        pressed[event.key.keysym.sym] = false; // on met à jour l'état de la touche
    }
    break;
    A+,

  3. #3
    Needer

    Re : RepeatKeys sous OpenGL

    Merci pour ta réponse, je vais essayer avec cette technique !

  4. #4
    inviteccac9361

    Re : RepeatKeys sous OpenGL

    Bonjour,

    Citation Envoyé par Lucas.gautheron
    Une idée comme ça (peut être pas la meilleure) :
    Stocker l'état de chaque touche (pressed = true ou false) dans un tableau. Quand tu détectes l'évènement d'appui sur une touche, tu ne lanceras l'action associée que si la touche n'était pas encore appuyée, puis tu mets à jour l'état de ta touche dans le tableau.
    C'est une excellent methode, le fait de stoquer l'état de la touche dans un tableau.
    Ca permet d'ajouter des touches suplémentaires facilement, si le besoin s'en fait sentir.

    Par contre, l'état true et false n'est pas, à mon avis la meilleur solution.
    Il vaut mieux utiliser un tableau d'entiers, qui stoque l'etat de la touche plus finement.
    Par exemple, si la touche est "disponible", l'etat vaudra -1.
    Lorsqu'un appui de touche est détécté, on vérifie avant de la traiter si la touche est disponible, donc que son état vaut -1 avant de lui attribuer une valeur X.
    On attribu a X une valeur par exemple 50, correspondant à la "temporisation", soit de l'action, soit de la prochaine disponibilité.

    On a deux possibilités, selon la criticité de la prise en compte de l'appui clavier.

    Criticité basse :
    X correspond au nombre nécéssaire de passages dans la boucle principale, avant que la touche soit à nouveau disponible et avant que l'action de la touche soit prise en compte.
    De plus, à chaque passage dans la boucle principale, si l'etat de la touche est égal à 0 alors on effectue l'action.
    Ensuite, si l'etat de la touche est plus grand que -1 (ce qui inclue le 0) alors on décremente la valeur de l'etat de la touche de -1.

    Criticité haute :
    X correspond au nombre nécéssaire de passages dans la boucle principale, avant que la touche soit à nouveau disponible.
    Cette fois, l'action est effectuée si X correspond à 50 (donc lorsqu'on affecte X avec "50" au moment de la prise en compte de l'appui clavier précédent, il vaut mieux avoir prévu une variable TEMPO=50, pour faire la comparaison de X avec TEMPO).
    Ensuite, si l'etat de la touche est plus grand que -1 (ce qui inclue le 0) alors on décremente la valeur de l'etat de la touche de -1.

    Dans les deux cas, la disponibilité de la touche est conditionnée par TEMPO, qui correspond à un nombre d'iteration de la boucle principale.
    Le fin du fin, consiste à gérer la valeur de TEMPO en continu, c'est à dire de lui donner une valeur correspondant à un temps.
    Il est alors préalablement nécéssaire de calculer le "FPS", frame per second, (une frame = 1 passage dans la boucle principale).

  5. A voir en vidéo sur Futura

Discussions similaires

  1. convertir un fichier solidworks vers un fichier .c openGL sous visual studio ?
    Par invitec871b1d7 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 27/02/2012, 15h21
  2. probleme 3D opengl c+
    Par invite85257474 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 22/11/2011, 17h16
  3. OpenGL/FreeGlut sous Ubuntu
    Par invite29a81b47 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 08/11/2010, 04h55
  4. Opengl
    Par invite591b481e dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 17/05/2010, 11h39
  5. Firefox, mozilla et opengl
    Par inviteb271042d dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 13/12/2005, 14h48