2013-06-28 28 views
3

沒關係,所以我正在製作一個基本的太空船遊戲。是我還是pygame.key.get_pressed()不工作?

我不能讓旋轉工作,因爲它打亂了位圖,但是是另question.Should我甚至用GIF?任何其他文件類型的建議?

回到這裏點實際的,因此:

k = pygame.key.get_pressed() 

是的,自我解釋。這不起作用,因爲它按下時返回每個鍵。

如此,別的地方:

d = k[pygame.K_d] 

與另一行:

print d 

和另:

if d: 

所以,K作爲回報按下鍵盤上的每個按鍵。

無論d是否被按下,d都會無限期地返回0。

d始終爲0.

因此關於d的說法從來都不是真的。

這是怎麼發生的?

+0

你很難從你的措辭,告訴:你期待get_pressed()函數,只要按下一個鍵返回? –

+0

你的循環'打印D' – Serial

回答

6

您可能會對get_pressed()實際上在做什麼感到困惑。從文檔:

返回表示 鍵盤上的每個鍵的狀態布爾值的 序列。使用鍵常量值來索引數組。真值 表示該按鈕被按下。

掌握這個功能推按鈕列表中不處理來自用戶的文本輸入 有道。您無法知道 按下按鍵的順序,並且在兩次調用pygame.key.get_pressed()之間沒有注意到迅速按下的按鍵可以完全變爲 。也有 沒有辦法將這些推送的密鑰翻譯成完全翻譯的 字符值。查看事件隊列中的pygame.KEYDOWN事件 此功能。

換句話說,當你調用get_pressed(),你是在get_pressed()被調用的時間越來越鍵盤的狀態的表示。例如,讓我們說你在遊戲中調用get_pressed()後的一秒鐘。你將得到一個列出鍵盤上所有鍵的結構,如果它們被按下(它們全都是假的)。

在您的遊戲進入兩秒鐘後,您按下一個鍵。如果你看看你之前看到的相同結構,它仍然會說沒有按下任何東西,因爲你仍然在查看鍵盤的狀態,因爲它是第二次。但是,如果再次調用get_pressed(),則會返回一個新的更新結構,並且此新結構應顯示該鍵已按下。要解決這個

一種方法是做到以下幾點:

while True: 
    # Update Stuff 
    # Draw Stuff 
    state = pygame.key.get_pressed() 
    # Now check the keys 

現在,你要在鍵盤上上的最新信息。應該注意的

一件事是,使用上述功能,你還是可能會錯過一個鍵盤壓力機。如果更新的功能花了很長時間,一鍵可能被中,你會不會有一個名爲get_pressed()的時候,關鍵是下一個足夠小的時間然後按下未按。

如果這可能是一個問題,你可能會想使用的事件循環來代替。喜歡的東西...

is_moving = False 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_d: 
      is_moving = True 
     elif event.type == pygame.KEYUP and event.key == pygame.K_d: 
      is_moving = False 
+0

理論上,如果我定義更新功能(這就是所謂的遊戲者生命的每一幀),它應該工作的內部k和d。到目前爲止,我一直在度過一個可怕的日子,我應該想到這一點,但呃,我沒有!謝謝馬克。非常棒的回覆速度和偉大的洞察力,我可能應該有。我習慣於使用稍微不同的庫,通過像這樣的值引用函數將會有效且準確。我的錯! – user1321527

+0

另外,關鍵按鍵(獨立於以前的評論)。 get_pressed將獲得鍵盤上每個鍵的布爾值。 get_pressed不適用於事件pygame.KEYDOWN,這是關鍵的實際想法被關閉(允許輕鬆地持續移動)。在一幀通過之後(對於測試遊戲來說不是很多時間,它只是一個原型,我可以修復響應),應該返回準確的值。 – user1321527

+0

所以......我是否回答你的問題,或者不是? –

0

對於混合(1)事件和(2)keystate輸入,它看起來像

import pygame 
from pygame.locals import * 

done = False  

while not done: 
    for event in pygame.event.get(): 
     # any other key event input 
     if event.type == QUIT: 
      done = True   
     elif event.type == KEYDOWN: 
      if event.key == K_ESC: 
       done = True 
      elif event.key == K_F1: 
       print "hi world mode" 

    # get key current state 
    keys = pygame.key.get_pressed() 
    if keys[K_SPACE]: 
     #repeating fire while held 
     fire() 

我喜歡同爲KEYDOWN和KEYUP,

是真實的

你要查詢的事件。一種方法可以做到這一點是

while not done: 
    for event in pygame.event.get(): 
     # any other key event input 
     if event.type == QUIT: 
      done = True   
     elif event.type == KEYDOWN: 
      if event.key == K_ESC: 
       done = True 

    player.handle_event(event) 

然後在Player()

def handle_event(self, event): 
    if event.type == KEYDOWN: 
     if event.key == K_f: print 'Player.f pressed' 
+0

我很喜歡那個pygame.key.get_pressed事實()存在的for循環來處理事件之外。我想對KEYDOWN和KEYUP也是如此,但我永遠無法使它工作。爲什麼呢,你知道嗎? – user1321527

+0

我添加了代碼。您總是必須使用其中一個輪詢函數,但是,您可以在類別處理事件時將事件副本傳遞給「外部」。 – ninMonkey