我正在PyGame中开发一个简单的游戏......一艘火箭飞船飞来飞去并射击东西。
问题:为什么 pygame 在一次按下太多键时会停止发出键盘事件?
关于密钥处理:该程序有许多变量KEYSTATE_FIRE, KEYSTATE_TURNLEFT,例如 等...
- 处理事件时
KEYDOWN,它将相应的KEYSTATE_*变量设置为 True。 - 处理事件时
KEYUP,它将相同的变量设置为 False。
问题:
如果UP-ARROW和LEFT-ARROW被同时按下,pygame 在按下时不会发出KEYDOWN事件SPACE。此行为因键而异。按下字母时,我似乎可以在 pygame 停止KEYDOWN为其他键发出事件之前按住其中的 5 个。
验证:在我的主循环中,我只是打印了收到的每个事件来验证上述行为。
代码:作为参考,这里是此时处理关键事件的(粗略)方式:
while GAME_RUNNING:
FRAME_NUMBER += 1
CLOCK.tick(FRAME_PER_SECOND)
#----------------------------------------------------------------------
# Check for events
for event in pygame.event.get():
print event
if event.type == pygame.QUIT:
raise SystemExit()
elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_UP:
KEYSTATE_FORWARD = True
elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_UP:
KEYSTATE_FORWARD = False
elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_DOWN:
KEYSTATE_BACKWARD = True
elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_DOWN:
KEYSTATE_BACKWARD = False
elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_LEFT:
KEYSTATE_TURNLEFT = True
elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_LEFT:
KEYSTATE_TURNLEFT = False
elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_RIGHT:
KEYSTATE_TURNRIGHT = True
elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_RIGHT:
KEYSTATE_TURNRIGHT = False
elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_SPACE:
KEYSTATE_FIRE = True
elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_SPACE:
KEYSTATE_FIRE = False
# remainder of game loop here...
按此顺序:
a (down)s (down)d (down)f (down)g (down)h (down)j (down)k (down)a (up)s (up)d (up)f (up)g (up)h (up)j (up)k (up)
这是输出:
<Event(2-KeyDown {'scancode': 30, 'key': 97, 'unicode': u'a', 'mod': 0})><Event(2-KeyDown {'scancode': 31, 'key': 115, 'unicode': u's', 'mod': 0})><Event(2-KeyDown {'scancode': 32, 'key': 100, 'unicode': u'd', 'mod': 0})><Event(2-KeyDown {'scancode': 33, 'key': 102, 'unicode': u'f', 'mod': 0})><Event(3-KeyUp {'scancode': 30, 'key': 97, 'mod': 0})><Event(3-KeyUp {'scancode': 31, 'key': 115, 'mod': 0})><Event(3-KeyUp {'scancode': 32, 'key': 100, 'mod': 0})><Event(3-KeyUp {'scancode': 33, 'key': 102, 'mod': 0})><Event(2-KeyDown {'scancode': 36, 'key': 106, 'unicode': u'j', 'mod': 0})><Event(2-KeyDown {'scancode': 37, 'key': 107, 'unicode': u'k', 'mod': 0})><Event(3-KeyUp {'scancode': 36, 'key': 106, 'mod': 0})><Event(3-KeyUp {'scancode': 37, 'key': 107, 'mod': 0})>
这是一个常见问题吗?有解决方法吗?如果不是,那么在使用 pygame 时处理多键控制问题的最佳方法是什么?