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

2024-05-19 08:58:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个简单的游戏。。。一艘飞来飞去射击的火箭飞船。


问题:为什么pygame会停止发出键盘事件,而同时按下按键的次数也会增加?在

关于密钥处理:程序有很多变量,比如KEYSTATE_FIRE, KEYSTATE_TURNLEFT,等等。。。在

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

问题: 如果UP-ARROW和{}同时被按下,则当按下SPACE时,pygame不会发出KEYDOWN事件。此行为因关键点而异。当按下字母时,我似乎可以在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时,处理多个密钥控制问题的最佳方法是什么?在


Tags: andkeyeventmodtype事件pygamedict
3条回答

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

要测试它,只需按住键盘上的字母,看看新字母何时停止出现。在

我的建议是尝试将空间映射到其他地方的另一个键,然后看看会发生什么。在

正如其他人已经回避,某些(特别是更便宜,低端)键盘的质量很低keyboard matrix。使用这些键盘,某些组合键将导致您所经历的行为。另一个常见的副作用是“重影键”(ghost keys),在这种情况下,一个额外的按键将出现在实际上没有按下的输入流中。在

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

有些键盘不能同时发送某些键。通常用3个键就可以达到这个限制。在

相关问题 更多 >

    热门问题