2012-01-14 82 views
4

我想知道是否有使用poll()get()不從隊列中移除事件的方式。pygame的事件隊列

在我的比賽,我檢查輸入在不同的地方(不僅在主迴路),有時我需要在不同的地方,檢查相同的事件,但是當我檢查一次它從隊列中刪除。我嘗試使用peek(),但問題是我無法獲得與完成的事件對應的密鑰。

while 1: 
    event = pygame.event.poll() 
    if event.type == KEYDOWN: 
     return event.key 
    else: 
     pass 

#works but removes event from the queue 

這可以拿到鑰匙對應的事件,但與peek()它不能:

pygame.event.peek(pygame.KEYDOWN).key 
#dosent work 

但是我不能用第一種方法,因爲從隊列中刪除,所以我可以在事件不要檢查程序中其他地方的關鍵事件。
我不明白井queue是如何工作的,所以也許我只是弄錯但我想在不同的位置的第一個也是唯一我第一次檢查它的工作情況。

我的目標是檢查在不同類別的事件在我的遊戲。

感謝您的幫助

回答

2

我認爲更好的設計將是檢查的事件在一個地方 - 即使在分解出來的函數或方法的主循環代碼之外,並保留所有其他的relevnt事件數據對象(作爲屬性)或變量。

例如,你可以保持與所有當前按鍵,當前鼠標位置和按鈕狀態設置一個Python的引用,並且圍繞傳遞這些變量來函數和方法。否則,如果您只需要檢查按鍵和鼠標狀態(以及指針位置),您可以完全繞過事件(只保留對主循環中pygame.event.pump()的調用)。 pygame.key.get_pressed函數是我最喜歡的閱讀鍵盤的方式 - 它返回的序列的位置與鍵碼一樣多,並且每個按下的鍵的相應位置在此向量中設置爲True。 (keycodes在pygame.locals中可用作常量,如K_ESC,K_a,K_LEFT等)。

例:

if pygame.key.get_pressed()[pygame.K_ESCAPE]: 
    pygame.quit() 

鼠標模塊(http://www.pygame.org/docs/ref/mouse.html記錄)可以讓你獲得鼠標狀態而不消耗事件也是如此。最後,如果你真的想要得到事件,我看到的可能性是,如果事件沒有被消耗,則將事件重新發布到隊列中,呼叫pygame.event.post - 可以放置此呼叫,例如在else條款在if/elif序列中檢查事件隊列中的某個狀態。

+0

好的,謝謝你的回答,所以我將有一個主循環併發送事件和參數我的其他功能。另外,如何發佈工作?我閱讀文檔,但我無法弄清楚。 – John 2012-01-15 14:02:28

0

我不知道這是否是好的風格,但我所做的只是保存在一個變量的所有事件,並將其傳遞到用自己的事件隊列來檢測「他們」事件的對象。

while running: 
     events = pygame.event.get() 
     for event in events: 
      if event.type == pygame.QUIT: 
       running = False 

     self.allS.update(events) 

,並在更新方法:

for event in events: 
    print("Player ", event)