Проблема в том, что все события сохраняются в списке, и вы замедляете код, поэтому у системы есть время поместить два (или более) KEYDOWN
событий в этот список, прежде чем вы запустите for event
l oop, который проверяет все KEYDOWN
в этом списке.
Как упоминалось в @ VaclavPel c, вы можете использовать переменную для управления, если вы уже изменили направление и пропустите другие клавиши.
Таким образом, будет использоваться только первый правильный ключ / направление при нажатии многих клавиш - поэтому вы не можете быстро изменить решение - ie. когда вы двигаетесь вниз и нажимаете left
и right
, тогда он будет использовать left
, потому что это первое правильное направление.
while True:
changed_direction = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if not changed_direction:
if event.key == pygame.K_RIGHT and left == False:
right = True
up = False
down = False
changed_direction = True
elif event.key == pygame.K_LEFT and right == False:
left = True
up = False
down = False
changed_direction = True
elif event.key == pygame.K_DOWN and up == False:
down = True
right = False
left = False
changed_direction = True
elif event.key == pygame.K_UP and down == False:
up = True
right = False
left = False
changed_direction = True
Другой метод - сохранить предыдущее направление в разных переменных и использовать эти переменные при проверке предыдущего направления.
Таким образом, при нажатии многих клавиш будет использоваться последняя правильная клавиша / направление - так что вы можете быстро изменить решение - ie. когда вы двигаетесь вниз и нажимаете left
и right
, тогда он будет использовать right
, потому что это последнее правильное направление.
while True:
previous_left = left
previous_right = right
previous_up = up
previous_down = down
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT and previous_left == False:
right = True
up = False
down = False
elif event.key == pygame.K_LEFT and previous_right == False:
left = True
up = False
down = False
elif event.key == pygame.K_DOWN and previous_up == False:
down = True
right = False
left = False
elif event.key == pygame.K_UP and previous_down == False:
up = True
right = False
left = False