PyGame не получает события при одновременном нажатии клавиш 3+ - PullRequest
3 голосов
/ 23 февраля 2009

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


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

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

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

Проблема: Если одновременно нажимаются UP-ARROW и LEFT-ARROW, то при нажатии SPACE pygame НЕ генерирует событие KEYDOWN. Это поведение варьируется в зависимости от ключей. При нажатии букв кажется, что я могу удержать около 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?

Ответы [ 4 ]

10 голосов
/ 23 февраля 2009

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

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

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

5 голосов
/ 23 февраля 2009

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

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

2 голосов
/ 23 февраля 2009

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

1 голос
/ 23 февраля 2009

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

...