如何正确使用"sdl2.SDL_GetKeyboardState"



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

我主要需要做的是测试是否按下了某些键。在做了一些研究之后,我发现了sdl2.SDL_GetKeyboardState,它被认为是与SDL_GetKeyboardState相同的SDL函数。根据之前链接的文档和LazyFoo’Productions网站上的这篇文章,我构建了以下脚本:

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 key pressed'会打印4000多次。它不会继续打印消息,只打印数千次,然后停止。

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

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

听起来像是按照预期的方式工作。每当按下时,key_states[sdl2.SDL_SCANCODE_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()

相关内容

  • 没有找到相关文章

最新更新