如何正确使用“sdl2.SDL\GetKeyboardState”?

2024-10-05 11:08:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用python库pysdl2构造一个仿真器。到目前为止,这个库运行得很好,但是我在接收键盘输入时遇到了问题。在

我基本上需要做的是测试某些按键是否被按下。在做了一点研究之后,我发现了sdl2.SDL_GetkeyboardState,它应该是与{a2}相同的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'将被打印出超过4000次。它不会继续打印消息,它只打印一次数千次,然后停止。在

首先,我认为问题可能是密钥扣除代码(第15-16行)应该在事件循环(第11-14行)内部。这在一定程度上起了作用。它不是每次按键打印出数千次,而是每次按键只打印两次。在

我的代码有问题吗?我是否遗漏了一些关于如何正确使用sdl2.SDL_GetKeyboardState函数的内容?如何正确检测按键?在


Tags: key函数代码eventifwindowrunningext
1条回答
网友
1楼 · 发布于 2024-10-05 11:08:20

听起来像是在按计划工作。key_states[sdl2.SDL_SCANCODE_A]将在按下a时返回true。在你的循环中没有太多的处理,所以它会以你的CPU允许的速度循环,每秒打印出几百或数千次“按键”,直到你释放按键为止。在

您可以检查不同的事件类型,例如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()

相关问题 更多 >

    热门问题