[英]Pygame event queue
我想知道是否有一種使用poll()
或get()
而不從隊列中刪除事件的方法。
在我的游戲中,我在不同的地方(不僅在主循環中)檢查輸入,有時我需要在不同的地方檢查相同的事件,但是一旦它從隊列中刪除它,當我檢查它時。 我嘗試使用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
是如何工作的,所以也許我只是弄錯了,但我在不同的位置嘗試了第一個,並且只是第一次檢查它起作用的事件。
我的目標是在我的游戲中檢查不同課程中的事件。
謝謝你的幫助
我認為更好的設計是在單個位置檢查事件-即使在mainloop代碼之外的分解函數或方法中,也將所有相關事件數據保留在其他objetcts(作為屬性)或變量中。
例如,您可以使用所有當前按下的鍵,當前的鼠標位置和按鈕狀態來保留對Python集合的引用,並將這些變量傳遞給函數和方法。
否則,如果您只需要檢查按鍵和鼠標狀態(以及指針指向),則可以完全繞開事件(僅在mainloop上保留對pygame.event.pump()的調用)。 pygame.key.get_pressed
函數是我最喜歡的讀取鍵盤的方法-它返回一個序列,該序列的位置與鍵碼一樣多,並且每個按下的鍵在此向量中的對應位置都設置為True
。 (鍵碼可以在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中記錄 )允許您在不消耗事件的情況下獲取鼠標狀態。
最后,如果您真的想要獲取事件,那么我看到的可能性是,如果事件未被消耗,則將事件重新發布到Queue中,並調用pygame.event.post
可以將其放置在例如else
子句中以if / elif順序,在其中檢查事件隊列中的某些狀態。
我不知道這是否是一種好的樣式,但是我所做的只是將所有事件保存在變量中,然后將其傳遞給使用自己的事件隊列檢測“其”事件的對象。
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)
據我所知,沒有一種“正確”的方法可以做到這一點,但一種選擇是將所有事件保存到一個變量中。 然后,您可以根據需要多次訪問它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.