PyGame在同时按下3+键时不接收事件

时间:2009-02-23 05:55:35

标签: python pygame keyboard-events

我正在PyGame开发一个简单的游戏...一架火箭飞来飞去拍摄东西。


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

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

  1. 处理KEYDOWN事件时,会将相应的KEYSTATE_*变量设置为True。
  2. 处理KEYUP事件时,会将同一个变量设置为False。
  3. 问题: 如果同时按下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时处理多键控制问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:10)

这听起来像输入问题,而不是代码问题 - 你确定问题不是键盘本身吗?大多数键盘对可以同时按下的键数量有限制。通常情况下,你不能按压多个一起靠近的键。

要测试它,只需开始按住键盘上的字母并查看新字母何时停止显示。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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