2012-08-14 25 views
1

在pygame的,我使用的功能「pressed_key」如何每秒只獲得一次密鑰輸入? (或延遲兩個鍵盤輸入之間的時間)

這是我的代碼:

if(pressed_keys[K_y]): 
    base += 10; 

但是當我按它只有一次做到這一點, 「基數」上漲了200點。我想知道是否有辦法增加兩次錄入之間的時間?

感謝您的幫助!

(PS我真的不知道如何尋找類似的問題在這個問題上,我再次希望這不是複製的。但如果是這樣,讓我知道,我會刪除這個問題。謝謝!)

回答

1

我希望您對pygame有足夠的瞭解,以便使用clock

(爲簡單起見,我們會說會是一秒所需的時間間隔)

一個簡單的解決辦法是隻檢查輸入的每一秒,使用一個簡單的計數器和pygame的時鐘。

首先關閉你的主循環以外的時鐘和計數器,。 另外,添加一個布爾變量來確定在這秒鐘內是否按下了鍵。

FRAMERATE = 30 #(The framerate used in this example is 30 FPS) 
clock = pygame.time.Clock() 
counter = 0 
not_pressed = True 

然後在主循環中,你要做的第一件事是增加計數器,然後tick the clock

while argument: 
    counter+=1 
    clock.tick(FRAMERATE) 

然後是你有你的代碼,if聲明,看看是否按鈕被按下第二個:

if not_pressed: 
    if(pressed_keys[K_y]): 
     not_pressed=False 
     base += 10 
#Rest of code: 
if(pressed_keys[K_up]): 

最後,在你的主循環的末尾,添加一個檢查切換布爾not_pressed回真正的每秒:

if counter == FRAMERATE: 
    counter=0 
    not_pressed=True 

這應該允許該程序只需要從用戶每秒一次輸入。 要更改間隔,只需更改if counter == FRAMERATE:一行。

  • if counter == FRAMERATE:會在1秒鐘
  • if counter == (FRAMERATE*2):將是2秒
  • if counter == int(FRAMERATE/4):將是第二個*

*四分之一注意 - 請確保您打開FRAMERATE由許多分,變成一個整數,要麼使用周圍的分區使用int(),要麼使用整數除法:(FRAMERATE//4)

有關類似示例以瞭解所有內容如何適用,請參閱this answer

+0

好吧,現在的問題其實更加複雜。現在我需要上,下,左,右鍵重複禁用,但只有「y」鍵才能夠重複功能。這是可能的,bcz y就像接受購買的東西,但其他鍵是移動。非常感謝! – windsound 2012-08-15 13:47:55

+1

@windsound只要你有'if'語句來處理'if not_pressed'外的其他鍵,它們會在你按下它們時作出反應。如果你喜歡,你可以把'not_pressed'改成'y_not_pressed'。 – hammythepig 2012-08-15 13:56:03

+0

@hammythebig有道理,但現在的問題是我的其他鍵不工作。我現在不能移動我的角色。你有其他的方式來聊天,我想更多地瞭解clock.tick功能。非常感謝! – windsound 2012-08-15 16:02:57

2

這裏http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat

pygame.key.set_repeat(delay, interval): return None 

也:

pygame.key.get_pressed()[K_y]: return bool 

另一種方式再次接受之前,讓你接受了「按鍵」的時間,並等待:

import time 
interval = 100 #you set your interval in miliseconds 
lasttime = 0 

while 1: 
    draw() #draw routine 
    events() #another events 
    now = time.time() #save in one variable if you are going to test against more than one, reducing the number of time.time() calls 
    if(pressed_keys[K_y] and (now-lasttime)>interval): 
     lasttime = now 
     base += 10 

time.time()返回自紀元以來的時間,以秒爲單位的浮點數。這個時代是時間開始的地方。當年的1月1日,0時,「時代以來的時間」爲零。對於Unix,這個時代是1970年。

知道,你現在正在獲取時間與上一次保存時間: now-lasttime。
當此增量大於間隔時間時,您可以繼續活動,不要忘記更新您的上次變量。

+0

好吧,現在的問題其實更加複雜。現在我需要上,下,左,右鍵重複禁用,但只有「y」鍵才能夠重複功能。這是可能的,bcz y就像接受購買的東西,但其他鍵是移動。非常感謝! – windsound 2012-08-15 13:37:38

+1

使用列表中的鍵使其成爲「for」:「用於[K_UP,K_LEFT,K_DOWN,K_RIGHT]中的鍵:如果pressed pressed keys [key]:#code」,則還可以包含具有回調的另一個列表(key_list,func_list):如果pressed pressed keys [key]:func()#call相應的函數「,funclist是[func_up,func_left ...] with是」 def func_up():#code「 在Python文檔中搜索」zip「語法。 – 2012-08-15 15:21:05

相關問題