我在SDL中尝试键盘输入,我遇到了一个奇怪的问题。每当我得到输入时,它只会输出相应的响应(单击X有时只关闭程序,有时按1只输出"你按1和#34;。这是我的主要代码:
#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";
}
任何帮助将不胜感激!
答案 0 :(得分:3)
来自SDL_PollEvent()
的文档:
如果事件不为NULL,则从队列中删除的下一个事件和 存储在事件指向的SDL_Event结构中。
分析您的代码:
if (input.check_event() == "1") {
此从队列中移除事件,无论它是什么。
} else if (input.check_event() == "quit") {
假设第一次拨打check_event()
的返回值为&#34;退出&#34;,则此呼叫不会返回&#34;退出&#34;再次,因为这些信息现在丢失了。
要解决此问题,请在每次循环迭代时仅调用check_event()
一次,并将结果存储在临时变量中。然后在条件中仅使用该变量:
while (true) {
string event = input.check_event();
if (event == "1") {
cout << "You pressed 1" << endl;
} else if (event == "quit") {
break;
}
}