2017-04-01 3 views
0

J'expérimente avec une entrée au clavier en SDL et j'ai rencontré un problème étrange. Chaque fois que je reçois l'entrée, il ne sort que la réponse appropriée parfois (Clicking X ne se ferme parfois le programme, en appuyant sur 1 sorties uniquement parfois « vous appuyez sur 1 » Voici mon code principal.Les entrées SDL fonctionnent seulement parfois

#include <iostream> 
#include <SDL.h> 

#include "Screen.h" 
#include "Input.h" 
using namespace std; 

int main(int argc, char *argv[]) { 
    Screen screen; 
    Input input; 
    if (screen.init() == false) { 
     cout << "Failure initializing SDL" << endl; 
    } 

    while (true) { 

     if (input.check_event() == "1") { 
      cout << "You pressed 1" << endl; 
     } else if (input.check_event() == "quit") { 
      break; 
     } 

    } 

    SDL_Quit(); 
    return 0; 

et voici ma classe d'entrée :

#include <iostream> 
#include <SDL.h> 
#include "Input.h" 
using namespace std; 
string Input::check_event() { 
    while (SDL_PollEvent(&event)) { 
     if (event.type == SDL_QUIT) { 
      return "quit"; 
     } 
     else if(event.type == SDL_KEYDOWN){ 
      switch(event.key.keysym.sym){ 
      case SDLK_1: 
       return "1"; 
      } 
     } 
    } 
    return "null"; 
} 

Toute aide serait appréciée

Répondre

3

la documentation de SDL_PollEvent():

Si l'événement n'est pas NULL, l'événement suivant est supprimé de la file d'attente et stocké dans la structure SDL_Event pointée par événement.

Analyser votre code:

if (input.check_event() == "1") { 

Cette supprime l'événement, quel qu'il soit, de la file d'attente.

} else if (input.check_event() == "quit") { 

Dites la valeur de retour du 1er appel à check_event() a été « quitter », alors cet appel ne reviendra pas à nouveau « quitter », parce que cette information est maintenant perdu.

Pour résoudre ce problème, appelez le check_event() une seule fois par boucle d'itération et stockez le résultat dans une variable temporaire. Utilisez ensuite uniquement cette variable dans les conditions suivantes:

while (true) { 
    string event = input.check_event(); 
    if (event == "1") { 
     cout << "You pressed 1" << endl; 
    } else if (event == "quit") { 
     break; 
    } 
}