SDL 和 GLFW 每次轮询仅报告一个键(重复),即使同时按住多个键也是如此

SDL and GLFW only report one key (repeat) per poll even if multiple keys are held down at the same time

本文关键字:一个 GLFW SDL 报告 重复      更新时间:2023-10-16
SDL_Event event;
while(SDL_PollEvent(&event)){
    if(event.type == SDL_KEYDOWN || event.type == SDL_KEYUP){
         //...
    }
}

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
}

例如,我同时按 WS,两个库都报告WS已被按下。

但是,如果我继续按住WS,只会报告一个键,就好像另一个键根本没有按住一样。

此外,如果我按住WS并且只报告S并且我按另一个键,例如Q两个库都不会报告当前根本没有按住任何键。

似乎两个库的密钥状态repeated几乎毫无用处。

这是标准行为还是它只是发生在我的系统上?

在处理SDL_KEYUPSDL_KEYDOWN事件时,可以使用SDL_GetKeyboardState一次检查多个键的状态。键盘状态保存所有键的当前状态。SDL_GetModState调用应用于修改键,如 Ctrl 或 Shift。

快速示例:

static void keyboard_handler()
{
    int n, count = 0;
    char buf[80];
    const uint8_t *state = SDL_GetKeyboardState(&count);
    buf[0] = 0;
    if (state[SDL_SCANCODE_RIGHT]) strcat(buf, "right ");
    if (state[SDL_SCANCODE_LEFT]) strcat(buf, "left ");
    if (state[SDL_SCANCODE_UP]) strcat(buf, "up ");
    if (state[SDL_SCANCODE_DOWN]) strcat(buf, "down ");
    if (buf[0] != 0)
        printf("%sn", buf);
}

运行它以响应SDL_KEYUPSDL_KEYDOWN事件 一次按住多个箭头键时,我打印了多个单词。 例如:

left
right left
left up down