SDL_GetKeyboardState不返回密钥的当前状态

时间:2014-12-15 21:23:54

标签: c++ c keyboard sdl sdl-2

我正在使用SDL 2.0,我无法让SDL_GetKeyboardState按预期工作。玩家应该上下移动,但这不会发生。

void Movements() {

    const Uint8  *currentKey = SDL_GetKeyboardState(NULL);  // Point has to be defined once

    if (currentKey[SDLK_w]){
            PlayerPaddle.y = PlayerPaddle.y+2;
        }

    if (currentKey[SDLK_s]){
            PlayerPaddle.y = PlayerPaddle.y+2;
        }

}

int main(int argc, char* args[]) {

    main_menue();

    bool running = true;

    while (running == true) {
        SDL_PollEvent(&occur);

        if (occur.type == SDL_QUIT) {  // Closes the window, if user stops running
            running = false;
        }
        Movements();
    }
}

我还试图用PumpEvents打开事件循环,但仍无法读取密钥的当前状态。我也在stackoverflow(SDL_GetKeyboardState not working)上找到了这个,但那里的答案并没有帮我找到解决方案。我在这里错过了什么吗?我真的失明并且误解了什么吗?

1 个答案:

答案 0 :(得分:0)

假设SDL_Init()和其他声明在粘贴时刚刚删除。

首先,您没有使用正确的索引。 正如in the documentation here所解释的那样:“使用SDL_Scancode values获取此数组的索引。”但是您使用的是SDL_Keycode值。

另一个问题是你在每次迭代时使用非阻塞SDL_PollEvent并调用Movements(),并且在循环中没有任何阻塞或等待。这将使用100%的CPU,尽可能快地运行,并且你最终会得到一个非常高的y值......

您可以使用关键事件代替SDL_GetKeyboardState返回的数组。如果occur.type例如是SDL_KEYDOWN,则occur.key.keysym.sym是所按下的键的SDL_Keycode。有关详细信息,请查看SDL_Event和其他事件类型的文档。

您还应该在循环中添加SDL_Delay

另一种方法是使用SDL_WaitEvent,它仅在事件发生时返回。然后你处理事件,如果它是按键,按键做一些动作等等......