Я разрабатываю простую игру в PyGame ... Ракетный корабль, летящий вокруг и стреляющий в вещи.
Вопрос: Почему Pygame перестает генерировать события клавиатуры, когда тоже могут быть нажаты клавиши одновременно?
Об обработке ключей: В программе имеется ряд переменных, таких как KEYSTATE_FIRE, KEYSTATE_TURNLEFT
и т. Д. *
- Когда обрабатывается событие
KEYDOWN
, для соответствующей переменной KEYSTATE_*
устанавливается значение True.
- Когда обрабатывается событие
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?