我正在PyGame中开发一个简单的游戏飞来飞去射击的火箭船。
问题:当同时按下may键时,pygame为什么停止发出键盘事件?
关于密钥处理:程序有许多变量,如KEYSTATE_FIRE, KEYSTATE_TURNLEFT,等等。。。
当处理KEYDOWN事件时,它会将相应的KEYSTATE_*变量设置为true。
当处理KEYUP事件时,它会将同一变量设置为false。
问题是:
如果同时按下UP-ARROWLEFT-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时处理多个密钥控制问题的最佳方法是什么?

最佳答案

这听起来像是输入问题,而不是代码问题-你确定问题不是键盘本身吗大多数键盘对可同时按下的键数有限制。通常情况下,一次按下的键不能超过几个。
要测试它,只要开始按住键盘上的字母,看看新字母何时停止出现。
我的建议是尝试将空间映射到其他地方的另一个键,然后看看会发生什么。

09-16 17:13