簡體   English   中英

Pygame 事件隊列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM