SDL 在不使用事件的情况下获取键盘状态

Sco*_*ott 3 c++ gtk keyboard events sdl

有谁知道如何让 SDL_GetKeyState 正常工作,而不必设置轮询 SDL 事件的循环?

int *keystates;
keystates = SDL_GetKeyState(NULL);
SDL_PumpEvents();
std::cout << "Test 1\n";
if (keystates[SDLK_F1]) {
    std::cout << "Test 1 Okay\n";
    key_ac = true;
    emu->setPower(true);
}
Run Code Online (Sandbox Code Playgroud)

这段代码每秒运行 100 多次,但是即使我按住 F1 键,我仍然没有得到任何输出表明它成功了。

我没有 SDL 事件循环,所以这可能是因为我没有使用它们而丢弃事件吗?在这种情况下,我怎样才能让 SDL 过滤掉所有事件?

小智 5

SDL_GetKeyState() 只需在程序开始时调用一次。

unsigned char * keys = SDL_GetKeyState(NULL);
Run Code Online (Sandbox Code Playgroud)

然后它返回的值,一个指向数组的无符号字符指针存储在内部。要更新数组的状态,请调用该函数SDL_PumpEvents()

keys在主循环中更新数组:

SDL_PumpEvents();

if( keys[ SDLK_m ] )
{
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

编辑:您可以SDL_GetKeyState()在第一次调用后尽可能多地调用,并且不会造成内存泄漏。该函数始终返回相同的指针。