Обнаружение нажатия одной клавиши с помощью key.get_pressed()

#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 предшествующего ему. И a while с безусловным 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