如何在 SDL2 C++ 中获取持久输入

How to get persistent input in SDL2 c++

所以我注意到,当使用 SDL_GetKeyboardState(NULL) 进行输入时,当按住特定按钮时,它会首先写入 outlets say a,然后在 1 秒后它会继续 aaaaaaaa 通常情况下。我想当我按住按钮 a 时它会自动变为 aaaaaa。 如果您不理解我糟糕的解释,请观看以下视频: https://streamable.com/oub0w3

先写出a和写出aaaaa之间有一个延迟大约1秒。我该如何改变它? (我希望没有延迟)

这是我的代码:

while (gameRunning) {
    SDL_Event event;
    const Uint8* keystates = SDL_GetKeyboardState(NULL);
    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT) {
            gameRunning = false;
        }
        if (keystates[SDL_SCANCODE_W]) {
            entities[0].setY(entities[0].getY() - 1);
        }
        if (keystates[SDL_SCANCODE_S]) {
            entities[0].setY(entities[0].getY() + 1);
        }
        if (keystates[SDL_SCANCODE_A]) {
            entities[0].setX(entities[0].getX() - 1);
        }
        if (keystates[SDL_SCANCODE_D]) {
            entities[0].setX(entities[0].getX() + 1);
        }
}

您在滥用 SDL_GetKeyboardState(nullptr)

应该在主循环中使用,而不是在事件循环中使用:

while (gameRunning)
{
    SDL_Event event;
    while (SDL_PollEvent(&event))
    {
        if (event.type == SDL_QUIT)
            gameRunning = false;
    }
    const std::uint8_t *keystates = SDL_GetKeyboardState(nullptr);
    if (keystates[SDL_SCANCODE_W])
        entities[0].setY(entities[0].getY() - 1);
    if (keystates[SDL_SCANCODE_S])
        entities[0].setY(entities[0].getY() + 1);
    // An so on...
}

如果您希望立即开始重复,您需要自己实现重复字母。

您作为事件收到的额外“a”字符(我假设)是由操作系统生成的,因此除非您在 OS 上进行了一些设置,否则您可以更改为立即开始重复,您需要你的程序来做。

(我假设 SDL 不是生成这些字符的那个,这可能是一种可能性)

为此,您需要让系统检查经过的时间并跟踪按下按键的时间,并输出它自己生成的“按键”事件,就像 OS正在做。