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

SDL Discussion :

[SDL] Gestion d'évènements au clavier


Sujet :

SDL

  1. #1
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Points : 70
    Points
    70
    Par défaut [SDL] Gestion d'évènements au clavier
    Bonsoir.

    Je souhaite gérer des évènements lorsque l'utilisateur appuie sur certaines touches. Par exemple la pause. Or, lorsque je tape sur la lettre p, la pause se fait, mais lorsque je rappuie sur p (géré dans la fonction pause()), l'exécution reprend pour un tour, puis se remet en pause.
    J'ai un problème similaire avec les évènements d'accélération et décélaration de la vitesse de l'application. J'ai dû passer à coté de quelque chose.

    Voici le code :
    Merci d'avance.

    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
     
    while (continuer == true)
        {
            SDL_PollEvent(&event); //récupération d"un évènement éventuel
            switch(event.type)
            {
                case SDL_QUIT: //si on a cliqué sur quitter
                    continuer = false; //on sort de la boucle while
                break;
                case SDL_KEYUP: //si on a tapé sur une touche
                    switch (event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                            continuer = false;
                            break;
                        case SDLK_a:
                            vitesse -=100;
                        break;
                        case SDLK_d:
                            vitesse +=100;
                        break;
                       case SDLK_p: //appui sur la touche p provoque la pause
                            cerr << "appui sur p" << endl;
                            pause();
                            cerr << "sortie de pause" << endl;
                            break;
                    }
                break;
     
            }
    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
     
    void pause()
    {
        cerr << "Entree en pause" << endl;
        bool continuer = true;
        SDL_Event event;
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT : continuer = false;
                case SDL_KEYDOWN:
                    switch (event.key.keysym.sym)
                    {
                        case SDLK_p: continuer = false; //on sort de la boucle
                            cerr << "appui sur p dans la pause" << endl;
                            break;
                    }
            }
        }
    }
    Enfin, voici le contenu de stderr.txt (les entrées et sorties dans pause() fonctionnent bien:

    appui sur p
    Entree en pause
    appui sur p dans la pause
    sortie de pause
    appui sur p
    Entree en pause
    appui sur p dans la pause
    sortie de pause
    appui sur p
    Entree en pause
    appui sur p dans la pause
    sortie de pause
    appui sur p
    Entree en pause
    sortie de pause

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    remplaces:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_PollEvent(&event); //récupération d"un évènement éventuel
    Par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( SDL_PollEvent(&event) ) //récupération d"un évènement éventuel
    ou:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (SDL_PollEvent(&event)) //récupération d"un évènement éventuel
    Pour la simple bonne raison qu'il ne faut pas essayer de traiter des events s'il n'y en pas.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 195
    Points : 115
    Points
    115
    Par défaut
    fais attention a l'utilisation de KeyDown et KeyUp
    visiblement tu sors de ta pause quand tu appuie sur "p" (keydown)
    mais quand tu vas relaché cette touche tu va etres automatiquement traité dans ton PollEvent avec ton KeyUp et inevitablement tu rentrera dans ta pause encore !
    utilise soit deux KeyUp soit deux KeyDown (je te conseille KeyUp car si tu maintient ta touche ta pause ne sera pas declenché question de confort )

  4. #4
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Points : 70
    Points
    70
    Par défaut
    D'accord, merci beaucoup à vous deux pour vos réponses?

    J'ai effectivement remplacé par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ( SDL_PolEvent (&event))
    En effet ça faisait un sorte boucle infini du coup

    Merci

Discussions similaires

  1. Gestion des événements clavier
    Par Tekkk dans le forum Débuter
    Réponses: 0
    Dernier message: 07/04/2011, 15h00
  2. [SDL] Gestion des événements ne marche pas
    Par lucas-84 dans le forum SDL
    Réponses: 5
    Dernier message: 17/11/2010, 14h18
  3. [WD15] Gestion des événements clavier dans une fenêtre.
    Par dvdbly dans le forum WinDev
    Réponses: 3
    Dernier message: 20/09/2010, 08h58
  4. Réponses: 3
    Dernier message: 02/09/2007, 16h53
  5. [SDL] Gestion des touches claviers problématique
    Par Invité4 dans le forum SDL
    Réponses: 3
    Dernier message: 13/10/2006, 21h15

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