2013-11-23 57 views
1

我正在嘗試編寫一個pong遊戲,在該遊戲中我可以使用向上和向下箭頭移動槳。我創建了一個Paddle對象,每次按下向上鍵時都會按給定量更新(在下面的代碼中作爲參數「num」傳遞)。我想要做的是允許用戶按住向上按鈕,這會導致槳在向上的方向上不斷移動。我試圖在while循環中編寫這個事件處理,但是我陷入了一個無限循環。這是下面的代碼:pygame按住按鍵會導致無限循環

for event in PE.get(): 
     if event.type == PG.KEYDOWN: 
      keystate = PG.key.get_pressed() 
      if event.key == PG.K_ESCAPE: 
       done = True 
      while keystate[PL.K_UP]: 
       rightPaddle.update(-20) 


     if event.type == PG.QUIT: 
      done = True 

下面是槳對象的代碼:

class Paddle(object): 

def __init__(self, x, y): 
    self.topleftx = x 
    self.toplefty = y 
    self.width = 15 
    self.height = 100 

def draw(self, surface): 
    rect = PR.Rect(self.topleftx, self.toplefty, \ 
         self.width, self.height) 
    surface.fill(WHITE, rect) 

def update(self, num): 
    self.toplefty += num 

我查了這個主題的其他計算器的問題,這是我發現PG.key.getPressed( )方法,但其他答案建議使用「精靈」,我不知道如何使用。任何人都可以提供一些關於如何去執行這個任務的建議嗎?

回答

1

while循環的問題在於它正在評估一個keydown事件。這個事件總是會以它開始的,並且在事件處理代碼中沒有機會改變它。你想要捕捉的是它後面的PG.KEYUP事件。所以你有什麼(邏輯),如

if event.type == PG.KEYDOWN and keystate[PL.K_UP]: 
    key_up_pressed = True 
elif event.type == PG.KEYUP and keystate[PL.K_UP]: 
    key_up_pressed = False 

顯然,你可以將這好,但key_up_pressed國家將在主循環一次,每隔一段時間得到評估(幀,毫秒,等等),和移動槳。

+0

我還是有點困惑。我明白爲什麼現在正在發生無限循環,但我似乎無法想出解決它的方法。即使我定義了一個key_up_pressed變量,我應該在哪裏放置update()方法?它是否仍然在事件驅動的循環? –

+0

不,它應該在你程序的主循環中。 SDL(和Pygame)程序通常由一個主循環構成,該循環處理事件,繪製到屏幕上,並執行需要做的事情(更新物理等)。您想將它放在那裏,因此可以經常更新。一旦它朝着正確的方向移動,嘗試將其與幀速率分離。 – nmichaels

1

在此代碼:

while keystate[PL.K_UP]: 
    rightPaddle.update(-20) 

...沒有什麼東西是可以改變keystate。所以,如果keystate[PL.K_UP]是真實的,那將永遠是真的。因此無限循環。

您可以每次通過循環獲取pygame中的當前密鑰信息,這至少可以使它不是無限的 - 但它仍然意味着您的整個程序會阻塞,直到用戶釋放密鑰。

不知道你是否打算編寫幀率驅動的遊戲或事件循環驅動的遊戲,我無法告訴你究竟如何解決它。

但無論哪種方式,關鍵在於只要按住按鍵,您想以特定速度移動,處理其間的其他事件,只要鍵被按下。無論哪種方式,您都將使用KEYDOWN和KEYUP事件來設置某種標誌,以告訴您移動槳。然後,每幀一次或使用計時器事件,或以其他方式,您將使用當前標誌值移動槳。