PyGame не получает события при одновременном нажатии трех+ клавиш

StackOverflow https://stackoverflow.com/questions/576634

  •  05-09-2019
  •  | 
  •  

Вопрос

Я разрабатываю простую игру в PyGame...Ракетный корабль летает и стреляет.


Вопрос: Почему pygame перестает генерировать события клавиатуры, когда одновременно нажимаются клавиши?

Об обработке ключей: Программа имеет ряд переменных, таких как KEYSTATE_FIRE, KEYSTATE_TURNLEFT, и т. д...

  1. Когда KEYDOWN событие обрабатывается, оно устанавливает соответствующее KEYSTATE_* переменную в True.
  2. Когда KEYUP событие обрабатывается, оно устанавливает для той же переменной значение False.

Проблема:Если UP-ARROW и LEFT-ARROW нажимаются одновременно, pygame НЕ ВЫДАЕТ KEYDOWN событие, когда SPACE нажимается.Такое поведение варьируется в зависимости от клавиш.При нажатии букв кажется, что я могу удерживать около 5 из них, прежде чем pygame перестанет выдавать KEYDOWN события для дополнительных ключей.

Проверка: В моем основном цикле я просто печатал каждое полученное событие, чтобы проверить вышеуказанное поведение.

Код: Для справки, вот (грубый) способ обработки ключевых событий на этом этапе:

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?

Это было полезно?

Решение

Это похоже на проблему ввода, а не на проблему с кодом. Вы уверены, что проблема не в самой клавиатуре?Большинство клавиатур имеют ограничения на количество клавиш, которые можно нажать одновременно.Часто вы не можете одновременно нажать более нескольких клавиш, расположенных близко друг к другу.

Чтобы проверить это, просто начните нажимать и удерживать буквы на клавиатуре и посмотрите, когда новые буквы перестанут появляться.

Я предлагаю попробовать сопоставить SPACE с другой клавишей где-нибудь еще и посмотреть, что произойдет.

Другие советы

Как уже ускользнули от других, некоторые (особенно более дешевые и недорогие) клавиатуры имеют низкое качество. матрица клавиатуры.При использовании этих клавиатур определенные комбинации клавиш будут приводить к тому поведению, которое вы испытываете.Другим распространенным побочным эффектом могут быть «призрачные клавиши», когда во входном потоке появляется дополнительное нажатие клавиши, которое на самом деле не нажималось.

Единственное решение (если проблема связана с матрицей клавиатуры) — изменить раскладку клавиш, чтобы использовать клавиши в разных строках/столбцах матрицы, или купить клавиатуру с лучшей матрицей.

Некоторые клавиатуры не могут отправлять определенные клавиши вместе.Часто этот предел достигается при наличии 3 ключей.

Это вполне может зависеть от клавиатуры.Моя текущая безымянная клавиатура поддерживает одновременное нажатие только двух клавиш, что часто является проблемой в играх.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top