2016-02-01 2 views
1

Что такое идиоматический способ сказать pygame, чтобы что-то запускать, пока нажата клавиша? С pygame.key.get_pressed()[pygame.K_p]==True или pygame.mouse.get_pressed()==(1,0,0) кажется, что он реагирует только как ключ или кнопка get stcken. Следует ли использовать цикл while?Pygame key get press

Я бегу код и я получаю печать в оболочке только при strocking ключ/кнопка:

def main(): 
done = True 
while done: 
    for i in pygame.event.get(): 
     if pygame.key.get_pressed()[pygame.K_a] == 1: 
      print "Key a is being pressed..." 
     elif i.type == KEYDOWN and i.key == pygame.K_q: 
      done = 0 
    pygame.display.update() 
pygame.quit() 
main() 
+2

не использовать 'get_pressed()' inside' для ... в pygame.event.get() '. Вы будете повторять функцию много раз - если было много событий - или нулевое время - если не было никакого события. – furas

ответ

2

событие KEYDOWN означает «ключ изменилось состояние сверху вниз» - это не значит " клавиша удерживается нажатой все время»

enter image description here

При запуске нажатия клавиши - это генерировать событие KEYDOWN и pygame.event.get() возвращает не пустой список - и for цикла может Exe мило if pygame.event.get()

Когда вы держите нажатой клавишу - она ​​не генерирует событие KEYDOWN - и pygame.event.get() возвращает пустой список - и for петля не выполняет if pygame.event.get()

Ваш код должен выглядит как

running = True 
while running: 
    # check events 
    for event in pygame.event.get(): 
     if event.type == KEYDOWN: 
      if event.key == pygame.K_q: 
       running = False 

    # do it outside of `for event` loop 
    # it is executed many times 
    if pygame.key.get_pressed()[pygame.K_a]: 
     print "Key is hold pressed..." 

    pygame.display.update() 

или - когда вам нужно выполнить что-то только один раз

key_A_pressed = False 

running = True 
while running: 
    # check events 
    for event in pygame.event.get(): 
     if event.type == KEYDOWN: 
      if event.key == pygame.K_q: 
       running = False 

      elif event.key == pygame.K_a: 
       key_A_pressed = True 

       # it is executed only once 
       print "Key A - start pressing" 

     if event.type == KEYUP: 
      if event.key == pygame.K_a: 
       key_A_pressed = False 

       # it is executed only once 
       print "Key A - stop pressing" 

    # do it only once - outside of `for event` loop 
    # it is executed many times 
    #if pygame.key.get_pressed()[pygame.K_a]: 
    # or 
    if key_A_pressed: 
     print "Key A is held pressed..." 

    pygame.display.update() 
+0

Спасибо, так что, если я понимаю это правильно ** удержание ** ключ или кнопка не считается ** событием **? Таким образом, вы вообще не используете 'pygame.key.get_pressed'? Когда и где он может быть использован, если вы можете стимулировать ** удерживать ** в таком случае «event.type == KEYDOWN» вместо этого? – amirteymuri

2

Вы должны использовать:

def main(): 
    done = False 
    while not done: 
     for i in pygame.event.get(): 
      if i.type == KEYDOWN and i.key == pygame.K_q: 
       done = True 

     pressed = pygame.key.get_pressed()  
     if pressed[pygame.K_a]: 
      print "Key a is being pressed..." 

     pygame.display.update() 
    pygame.quit() 

if __name__ == '__main__': 
    main() 

Проблемы в коде является то, что вы проверяете для нажатых клавиш только при перебирает все ПОЛУЧАЛО событие; поэтому в случае отсутствия события часть print "Key a is being pressed..." никогда не будет выполнена.

Просто поставьте его вне цикла событий.

Кроме того, вам не нужно явно сравнивать с True; идиоматический/питонический способ - просто использовать if pressed[pygame.K_a]:.

+0

Спасибо за ваш ответ. Я думаю, что для меня было недоразумение; это означает, что 'key.get_pressed' должен быть обновлен в каждом цикле' while', чтобы дать продолжение вывода? Итак, какова будет разница между этим параметром и написанием 'if event.type == KEYDOWN и event.key == pygame.K_a' вне цикла while? Я попробовал оба, и кажется, что они имеют тот же эффект. – amirteymuri

+0

Когда вы нажимаете клавишу, генерируется событие «KEYDOWN». Если вы отпустите ключ, генерируется событие «KEYUP». Удержание клавиши вниз не создает новых событий (кроме случаев, когда вы включаете повторение клавиш, чего не следует делать). – sloth

+0

Я вижу. Не могли бы вы упомянуть пример того, где должно быть предложено явно «key.get_pressed»? – amirteymuri