2014-02-07 2 views
0

Я не смог найти прямой ответ.Как задержать pygame.key.get_pressed()?

key.set_repeat() работы для KEYDOWN событий, но не для key.get_pressed():

import sys, pygame 
from pygame.locals import * 

pygame.init() 
Clock = pygame.time.Clock() 
pygame.display.set_mode((200, 100)) 

pygame.key.set_repeat(1, 500) 

while True: 

    if pygame.key.get_pressed()[K_UP]: 
     print('up!') 

    for event in pygame.event.get(): 

     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 

     elif event.type == KEYDOWN: 
      if event.key == K_DOWN: 
       print('down!') 

    Clock.tick(30) 

Даже малейшее нажатие на UP взорвется по меньшей мере, несколько вверх с, только вниз с задержкой!. Я хочу использовать key.get_pressed(), так как он удобно обрабатывает несколько входов. Нужно ли мне обойти это с помощью какого-нибудь счетчика тиков? Кроме того, существует ли способ обработки нескольких событий KEYDOWN?

ответ

1

Просто не возитесь с key.set_repeat(), если вам не нужно.

Просто используйте key.get_pressed(), чтобы проверить нажатые клавиши и где сохранение нажатой клавиши имеет значение для вас, например. что-то вроде двигаться влево, пока K_LEFT нажимается.

Используйте event.get()/KEYDOWN, когда вы погружаетесь в один нажатие клавиши, например. что-то вроде нажатие K_P паузы игра.

Если вы общаетесь с key.set_repeat(), например. установите задержку на низкий уровень, вы не сможете распознать один ход ключа, так как каждый ход клавиши создает несколько событий KEYDOWN.

Чтобы обработать несколько событий KEYDOWN, просто проверьте соответствующие события. Каждый ход клавиши будет генерировать KEYDOWN события, так что вы можете просто проверить например .:

for event in pygame.event.get(): 
    if event.type == KEYDOWN: 
     if event.key == K_DOWN: 
      print('down!') 
     elif event.key == K_UP: 
      print('up!') 

Это, конечно, печать up!/down! несколько раз, если пользователь сохраняет нажатия клавиш.

Золотое правило: Если вы interessted в KEYDOWN и KEYUP случае одного ключа, лучше использовать key.get_pressed() вместо этого.


Даже малейшее нажатие на UP взрывается, по крайней мере несколько вверх! S, только вниз! S задерживаются

Это потому, что система событий и key.get_pressed() совершенно разные. Если вы нажимаете K_UP на несколько кадров, для каждого кадра 'up!' печатается, потому что клавиша нажата в каждом кадре. key.get_pressed() простой возврат, нажатие клавиш в тот момент, когда вы вызываете эту функцию. Другими словами: вы не можете «задержать» его.

+0

Благодарим вас за подробное объяснение. Документация pygame была немного неясной в этом вопросе, по крайней мере, для такого непрофессионала, как я. – ozu

Смежные вопросы