#python #pygame #keydown #keyup
#python #pygame #нажатие клавиши #нажатие клавиши
Вопрос:
Я пытаюсь обнаружить нажатие одной клавиши независимо от того, как долго нажата клавиша. Например, если клавиша «a» удерживается нажатой в течение 3 секунд, моя текущая программа напечатает это:
нажата клавиша
‘ааааааааааааа’
ключ отпущен
Я пытаюсь довести его до того, что он разрешит только одно действие за цикл нажатия / отпускания:
нажата клавиша
‘a’
ключ отпущен
нажата клавиша
‘a’
ключ отпущен
Что я делаю не так? Спасибо
def update(self):
space_released = True
space_pressed = False
elif event.type == KEYUP:
if event.key == K_SPACE:
self.space_released = True
elif event.type == KEYDOWN:
if event.key == K_SPACE:
self.space_released = False
key = pygame.key.get_pressed()
while space_released == True:
# Print key pressed
return
space_released = False
Комментарии:
1. Вы не можете иметь
elif
безif
предшествующего ему. И awhile
с безусловнымreturn
выражением в нем никогда не будет повторяться более одного раза. Кроме того, отступ вашего кода недопустим. Этот код не будет выполняться.
Ответ №1:
Используется pygame.key.set_repeat()
для управления повторением удерживаемых клавиш:
Когда включен повтор клавиатуры, удерживаемые клавиши будут генерировать несколько
pygame.KEYDOWN
событий. […][…] Чтобы отключить повторение клавиш, вызовите эту функцию без аргументов или с задержкой, установленной на 0.
Просто вызовите pygame.key.set_repeat()
, чтобы отключить повторяющиеся клавиши:
pygame.key.set_repeat()
run = True
while run:
clock.tick(60)
space_released = False
space_pressed = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == KEYUP:
if event.key == K_SPACE:
space_released = True
elif event.type == KEYDOWN:
if event.key == K_SPACE:
space_pressed = True
# [...]
Если вы хотите сделать что-то подобное с pygame.key.get_pressed ()
, вы должны сохранить состояние pygame.K_SPACE
и сравнить предыдущее ( space_was_pressed
) состояние с текущим состоянием ( space_is_pressed
):
space_was_pressed = 0
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
key = pygame.key.get_pressed()
space_released = True
space_pressed = False
space_is_pressed = key[pygame.K_SPACE]
if space_was_pressed != space_is_pressed:
space_released = not space_is_pressed
space_pressed = space_is_pressed
space_was_pressed = space_is_pressed