Pygame несколько ключей странное поведение
Я делаю игру с Pygame, и я столкнулся с проблемой следующего кода:
while not self.end: # main game loop
keys = pygame.key.get_pressed()
if keys[K_LEFT]:
adddirection(LEFT)
elif keys[K_RIGHT]:
adddirection(RIGHT)
elif keys[K_UP]:
adddirection(UP)
elif keys[K_DOWN]:
adddirection(DOWN)
Когда я удерживаю стрелку ВВЕРХ или ВНИЗ, если я нажимаю любую правую или левую клавишу, ничего не происходит, elif не разрешается. Зачем? Должен ли я сделать это по-другому?
Если я заменю все слова "elif" на "if", произойдет обратное. Если я удерживаю влево или вправо, то сверху и снизу никогда не разрешится.
Я хотел бы понять эту странную механику.
2 ответа
Таким образом, в соответствии с природой стеков elif, если один из них будет решен как истинный, он не будет проверять другие и просто пропустит, зацикливаясь на том, как, если elif еще работает где-то онлайн.
поэтому вам нужно либо использовать "if" для каждого, либо разбить его на цикл for.
Однако, так как вы говорите, когда используете if для всех из них, вы все равно не получаете ожидаемого поведения. Я подозреваю, что это может быть вызвано "adddirection()", не могли бы вы опубликовать это тоже, если не можете решить эту проблему?
Как уже упоминалось в другом ответе, вы также можете использовать события Pygame для обработки нажатий клавиш.
Проблема может оказаться неразрешимой. Клавиатуры работают так: каждая клавиша посылает сигнал по медному проводу через USB-кабель. Механические (игровые) клавиатуры имеют медный провод для каждой клавиши, однако, чтобы снизить стоимость дешевых клавиатур, многие клавиши имеют общий провод, и в результате одновременно может быть нажата только одна из клавиш, которые имеют общий провод. Клавиши со стрелками находятся на том же проводе, что может быть причиной вашей проблемы. ПричинаWASD
обычно используется для движения в играх, потому что 4 клавиши проходят по разным проводам.
TL; DR: вам может повезти, используя WASD
вместо клавиш со стрелками
Код был бы как
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if (event.key == K_LEFT):
//
elif (event.key == K_RIGHT):
//
elif (event.key == K_UP):
//
elif (event.key == K_DOWN):
//
keys_pressed = key.get_pressed()
if keys_pressed[K_LEFT]:
//
if keys_pressed[K_RIGHT]:
if keys_pressed[K_UP]:
//
if keys_pressed[K_DOWN]:
//
замещать //
с вашими условиями