我正在PyGame开发一个简单的游戏...一架火箭飞来飞去拍摄东西。
问题:为什么pygame会在同时按下按键时停止发出键盘事件?
关于密钥处理:该程序有许多变量,如KEYSTATE_FIRE, KEYSTATE_TURNLEFT
等......
KEYDOWN
事件时,会将相应的KEYSTATE_*
变量设置为True。KEYUP
事件时,会将同一个变量设置为False。 问题:
如果同时按下UP-ARROW
和LEFT-ARROW
,则按下KEYDOWN
时,pygame不会发出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时处理多键控制问题的最佳方法是什么?
答案 0 :(得分:10)
这听起来像输入问题,而不是代码问题 - 你确定问题不是键盘本身吗?大多数键盘对可以同时按下的键数量有限制。通常情况下,你不能按压多个一起靠近的键。
要测试它,只需开始按住键盘上的字母并查看新字母何时停止显示。
我的建议是尝试将SPACE映射到其他地方的其他键,看看会发生什么。
答案 1 :(得分:5)
正如其他人已经提到的那样,某些(特别是更便宜,低端)键盘的质量低keyboard matrix。使用这些键盘,某些键组合将导致您遇到的行为。另一个常见的副作用可能是“鬼键”,其中额外的按键将出现在未实际按下的输入流中。
唯一的解决方案(如果问题与键盘矩阵有关)是更改键映射以使用矩阵的不同行/列上的键,或者购买具有更好矩阵的键盘。
答案 2 :(得分:2)
某些键盘无法将某些键发送到一起。通常使用3个键达到此限制。
答案 3 :(得分:1)
这很可能取决于键盘。我目前的无名键盘只支持同时按下两个键,通常是游戏中的痛苦。