SDL 输入仅在有时起作用

SDL inputs only working sometimes

本文关键字:起作用 输入 SDL      更新时间:2023-10-16

我正在 SDL 中试验键盘输入,遇到了一个奇怪的问题。每当我得到输入时,它有时只会输出适当的响应(仅单击 X 有时关闭程序,仅按 1 有时输出"您按下 1"。这是我的主要代码:

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

任何帮助将不胜感激!

来自SDL_PollEvent()的文档:

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

分析代码:

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

这会从队列中删除事件,无论它是什么。

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

假设对check_event()的第一个调用的返回值是"quit",那么这个调用将不会再次返回"quit",因为此信息现在已丢失。

若要解决此问题,请在每个循环迭代中仅调用check_event()一次,并将结果存储在临时变量中。然后在条件中仅使用该变量:

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