【问题标题】:How can `sdl2.SDL_GetKeyboardState` be used correctly?如何正确使用`sdl2.SDL_GetKeyboardState`?
【发布时间】:2017-11-09 21:26:32
【问题描述】:

我正在尝试使用 python 库pysdl2 来构建一个模拟器。到目前为止,该库一直运行良好,但是我在接收键盘输入时遇到了问题。

我基本上需要做的是测试是否按下了某些键。经过一番研究,我发现了sdl2.SDL_GetKeyboardState,据说它与SDL_GetKeyboardState 具有相同的SDL 功能。按照之前链接的文档和this article on the Lazy Foo' Productions website,我构建了以下脚本:

import sdl2
sdl2.ext.init()

window = sdl2.ext.Window('Test', size=(640, 480))
window.show()

key_states = sdl2.SDL_GetKeyboardState(None)
running = True

while running:
    for event in sdl2.ext.get_events():
        if event.type == sdl2.SDL_QUIT:
            running = False
            break
    if key_states[sdl2.SDL_SCANCODE_A]:
        print('A key pressed')
    window.refresh()

上面的代码用来检测是否按下了 a 键,如果是则打印一条消息。当上面的程序运行时,确实会出现一个窗口,但是当按下 a 键时,'A key pressed' 被打印四千次。它不会继续打印消息,它只会打印数千次,然后停止。

起初,我认为问题可能是关键推演代码(第 15-16 行)应该在事件循环内部(第 11-14 行)。它在某种程度上起作用。 'A key pressed' 不是每次按键打印数千次,而是每次按键仅打印两次。

我的代码有问题吗?我是否遗漏了有关如何正确使用 sdl2.SDL_GetKeyboardState 函数的信息?如何正确检测按键?

【问题讨论】:

    标签: python sdl-2 keyboard-input pysdl2


    【解决方案1】:

    听起来它正在按应有的方式工作。只要按下 akey_states[sdl2.SDL_SCANCODE_A] 就会返回 true。而且你的循环中没有太多的处理过程,所以它会以你的 CPU 允许的速度循环,每秒打印出数百或数千次“A keypressed”,直到你释放这个键。

    您可以检查不同的事件类型,例如SDL_KEYDOWN,它的运行方式更像您想要的,或者您可以使用变量跟踪按键,例如:

    key_down = False
    while running:
        for event in sdl2.ext.get_events():
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
        if key_states[sdl2.SDL_SCANCODE_A] and not key_down:
            print('A key pressed')
            key_down = True
        elif not key_states[sdl2.SDL_SCANCODE_A] and key_down:
            print('A key released')
            key_down = False
        window.refresh()
    

    【讨论】:

    • 好的,我知道了。谢谢您的帮助。那会奏效的。我已经有一段时间没有使用过这样的库了。我想我错过了明显的答案 xD
    • 只是一个小小的批评:像这样构造你的 if 语句标题会更惯用(更不用说更短了):if key_states[sdl2.SDL_SCANCODE_A] and not key_downnot key_states[sdl2.SDL_SCANCODE_A] and key_down
    • 谢谢。我的蟒蛇有点生锈了。我根据您的建议更新了答案。
    猜你喜欢
    • 2021-01-31
    相关资源
    最近更新 更多