我试图使用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
功能的内容吗?如何正确检测按键?
答案 0 :(得分:1)
听起来它按照预期的方式工作。只要按下 a ,key_states[sdl2.SDL_SCANCODE_A]
就会返回true。你的循环中没有太多的处理,所以它的循环速度和CPU允许的速度一样快,每秒按下“A键”数百或数千次,直到你释放密钥。
您可以检查不同的事件类型,例如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()