2017-04-01 69 views
0

我正在试验SDL中的键盘输入,并且遇到了一个奇怪的问题。每当我输入仅输出相应的反应有时(点击X只是有时关闭该程序,按1只有时候输出“你按1”这是我的主要代码:SDL输入只能工作有时

#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; 

,这里是我的输入级:

#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"; 
} 

任何帮助,将不胜感激

回答

3

SDL_PollEvent()文档:

如果事件不是NULL,则下一个事件是,从队列中删除,并将 存储在由事件指向的SDL_Event结构中。

分析代码:

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

删除事件,不管它是什么,从队列中。

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

说第一个呼叫到check_event()是“跳槽”的返回值,则此调用将不会返回“跳槽”了,因为这个信息现在丢失。

为了解决这个问题,请致电check_event()每循环迭代一次,并把结果保存在一个临时变量。然后在条件中仅使用该变量:

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