2014-02-07 86 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絲毫自來水分解成至少數達S,只落後s的延遲!。我想使用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!多次。黃金法則是:如果您在KEYDOWNKEYUP事件中遇到單個密鑰,最好使用key.get_pressed()代替。


即使在UP絲毫自來水分解成至少有幾個了!S,只落後!s的延遲

這是因爲事件系統和key.get_pressed()是完全不同的。如果在多個幀上按K_UP,則每幀都會打印'up!',因爲每個幀都按下了該鍵。 key.get_pressed()簡單回報您在調用此功能時按下哪個鍵。換句話說:你不能「延遲」它。

+0

謝謝你的詳細解釋,pygame的文檔在這一點上有點不清楚,至少對於像我這樣的外行人來說。 – ozu