【问题标题】:Can't read keyboard input (SDL_GetKeyState)无法读取键盘输入 (SDL_GetKeyState)
【发布时间】:2024-01-04 16:18:02
【问题描述】:

我想使用 SDL 来检查是否按下了某个键。 我不工作。也尝试使用事件,但没有触发 SDL_KEYDOWN 事件。 Visual C++ 2010 速成版,Windows7。 也许我设置了 SDL 或项目错误?我怎么会知道?

SDL_PumpEvents();
Uint8 *keys = SDL_GetKeyState(NULL);
if (keys[SDLK_RIGHT]) {         
    this->player.xf+=2.0f;      // never reached
}

【问题讨论】:

    标签: sdl


    【解决方案1】:

    正如documentation 中所述,SDL_GetKeyState() 每个指针只能调用一次。

    Uint8 *keys = SDL_GetKeyState(NULL); 分配内存(!)并返回指向数组的指针。该数组在整个程序期间有效,不应被释放。

    调用此函数后,您将获得指向数组的指针,您可以使用它来检查带有
    keys[ SDLK_anykey ] 的键的状态。

    如果您想更新您的 keys 数组,您只需调用 SDL_PumpEvents();

    【讨论】:

    • 感谢您提供这一重要信息。但我仍然没有得到任何键盘输入。注意:我仅将 SDL 用于键盘输入。这是一个 Cocos2d-x 应用程序,遗憾的是它不支持键盘。这可能是问题吗?
    • @KarlH。不知道,我不熟悉 Cocos,或者你如何实现所有这些。查看 SDL 教程,确保您的活动设置正确。
    【解决方案2】:

    我知道这是旧的,但如果它有一个正确的答案会节省我几个小时,因为我犯了同样的简单错误。

    SDL_GetKeyState(NULL) 将 const 指针数组返回到 SCAN CODES

    列表

    if (keys[SDLK_RIGHT]) 在上面的 OP 代码中是一个 KEYCODE

    SDL_SCANCODE_RIGHT = 79
    

    SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT) //这超出了我的系统范围

    【讨论】:

      【解决方案3】:

      通常SDL_PollEvent 处理拉动键状态,最终调用SDL_PumpEvents()

      确实,您不需要在每次循环迭代时都创建一个新指针,但您的代码应该可以正常工作。如果我们要找到问题的“根源”,您需要提供一些额外的详细信息。

      【讨论】: