3

我正在PyGame中开发一个简单的游戏......一艘火箭飞船飞来飞去并射击东西。


问题:为什么 pygame 在一次按下太多键时会停止发出键盘事件?

关于密钥处理:该程序有许多变量KEYSTATE_FIRE, KEYSTATE_TURNLEFT,例如 等...

  1. 处理事件时KEYDOWN,它将相应的KEYSTATE_*变量设置为 True。
  2. 处理事件时KEYUP,它将相同的变量设置为 False。

问题: 如果UP-ARROWLEFT-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 时处理多键控制问题的最佳方法是什么?

4

4 回答 4

11

这听起来像是输入问题,而不是代码问题 - 您确定问题不是键盘本身吗?大多数键盘对可以同时按下的键的数量都有限制。很多时候,您一次只能按下几个靠近的键。

要对其进行测试,只需开始按住键盘上的字母,然后查看新字母何时停止出现。

我的建议是尝试将 SPACE 映射到其他地方的不同键,看看会发生什么。

于 2009-02-23T06:02:08.443 回答
5

正如其他人已经避开的那样,某些(尤其是更便宜的低端)键盘具有低质量的键盘矩阵。使用这些键盘,某些组合键会导致您遇到的行为。另一个常见的副作用可能是“鬼键”,其中额外的按键将出现在输入流中,但实际上并未按下。

唯一的解决方案(如果问题与键盘矩阵有关)是更改您的键映射以在矩阵的不同行/列上使用键,或者购买具有更好矩阵的键盘。

于 2009-02-23T20:42:15.553 回答
2

某些键盘无法将某些键一起发送。通常使用 3 个键即可达到此限制。

于 2009-02-23T06:03:05.667 回答
1

这很可能取决于键盘。我目前的无名键盘只支持同时按下两个键,这在游戏中经常很痛苦。

于 2009-02-23T06:02:59.957 回答