pygame.event用于處理事件與事件隊(duì)列的 Pygame 模塊。 函數(shù)
Pygame 通過(guò)事件隊(duì)列控制所有的時(shí)間消息。該模塊中的程序?qū)湍愎芾硎录?duì)列。輸入隊(duì)列很大程度依賴于 pygame 的 display 模塊。如果 display 沒(méi)有被初始化,顯示模式?jīng)]有被設(shè)置,那么事件隊(duì)列就還沒(méi)有開(kāi)始真正工作。 常規(guī)的隊(duì)列是由 pygame.event.EventType 定義的事件對(duì)象的組成,有多種方法來(lái)訪問(wèn)里邊的事件對(duì)象:從簡(jiǎn)單的檢測(cè)事件是否存在,到直接從棧中獲取它們。 所有事件都有一個(gè)類(lèi)型標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符對(duì)應(yīng)的值定義在 NOEVENT 到 NUMEVENTS 之間(溫馨提示:類(lèi)似于 C 語(yǔ)言的宏定義,明白?)。用戶可以自行定義事件,但類(lèi)型標(biāo)識(shí)符的值應(yīng)該高于或等于 USEREVENT。 獲取各種輸入設(shè)備的狀態(tài),推薦你直接通過(guò)它們相應(yīng)的模塊(mouse,key 和 joystick)提供的函數(shù)訪問(wèn),而不是通過(guò)事件隊(duì)列; 如果你使用此函數(shù),請(qǐng)記住,Pygame 需要通過(guò)一些方式與系統(tǒng)的窗口管理器和平臺(tái)的其他部分進(jìn)行通信。為了保持 Pygame 和系統(tǒng)同步,你需要調(diào)用 pygame.event.pump() 確保實(shí)時(shí)更新,你將在游戲的每次循環(huán)中調(diào)用這個(gè)函數(shù)。 事件隊(duì)列提供了一些簡(jiǎn)單的過(guò)濾。通過(guò)阻止某些事件進(jìn)入事件隊(duì)列,可以略微提高游戲的性能(溫馨提示:因?yàn)檫@樣事件隊(duì)列的尺寸就會(huì)小一些,所以說(shuō)可以略微提升性能)。使用 pygame.event.set_allowed() 和 pygame.event.set_blocked() 來(lái)控制某些事件是否允許進(jìn)入事件隊(duì)列。默認(rèn)所有事件都會(huì)進(jìn)入事件隊(duì)列。 事件子系統(tǒng)應(yīng)該在主線程被調(diào)用。如果你希望從其他線程中投遞事件消息進(jìn)入事件隊(duì)列,請(qǐng)使用 fastevent 包。 Joysticks(游戲手柄)只有在設(shè)備初始化后才會(huì)發(fā)送事件。 一個(gè) EventType 事件對(duì)象包含一個(gè)事件類(lèi)型標(biāo)識(shí)符和一組成員數(shù)據(jù)(事件對(duì)象不包含方法,只有數(shù)據(jù))。EventType 對(duì)象從 Python 的事件隊(duì)列中獲得,你也可以使用 pygame.event.Event() 函數(shù)創(chuàng)建自定義的新事件。 由于 SDL 的事件隊(duì)列限制了事件數(shù)量的上限(標(biāo)準(zhǔn)的 SDL 1.2 限制為 128),所以當(dāng)隊(duì)列已滿時(shí),新的事件將會(huì)被扔掉。為了防止丟失事件消息,尤其是代表退出的輸入事件(因?yàn)楫?dāng)用戶點(diǎn)擊退出按鈕沒(méi)有反應(yīng),往往會(huì)被認(rèn)為“死機(jī)”了),你的程序必須定期檢測(cè)事件,并對(duì)其進(jìn)行處理。 為了加快事件隊(duì)列的處理速度,可以使用 pygame.event.set_blocked() 函數(shù)阻止一些我們不關(guān)注的事件進(jìn)入隊(duì)列中。 所有的 EventType 實(shí)例對(duì)象都擁有一個(gè)事件類(lèi)型標(biāo)識(shí)符,屬性名是 type。你也可以通過(guò)事件對(duì)象的 __dict__ 屬性來(lái)完全訪問(wèn)其他屬性。所有其他成員屬性的值都是通過(guò)事件對(duì)象的字典來(lái)傳遞。 在做調(diào)試和實(shí)驗(yàn)時(shí),你可以打印事件對(duì)象以及相應(yīng)的類(lèi)型和成員。來(lái)自系統(tǒng)的事件都有一個(gè)事件類(lèi)型和對(duì)應(yīng)的成員屬性,下邊是每個(gè)事件類(lèi)型以及對(duì)應(yīng)的成員屬性列表:
事件支持等值比較。如果兩個(gè)事件具有相同的類(lèi)型和屬性值,那么認(rèn)為兩個(gè)事件是相等的。(Pygame 1.9.2 新增加的) 函數(shù)詳解pygame.event.pump()讓 Pygame 內(nèi)部自動(dòng)處理事件。 pump() -> None 對(duì)于游戲中的每一幀,你都需要通過(guò)某種形式去調(diào)用事件隊(duì)列,這將確保你的程序在內(nèi)部可以與操作系統(tǒng)的其他部分進(jìn)行交互。如果你不打算使用其他事件函數(shù),那么你應(yīng)該調(diào)用 pygame.event.pump(),這將允許 Pygame 內(nèi)部自動(dòng)處理事件。 如果你的程序始終通過(guò)其他 event 模塊的函數(shù)處理隊(duì)列中的事件,那么該函數(shù)是沒(méi)必要的。 事件隊(duì)列中的內(nèi)部處理是非常重要的事情。主窗口可能需要重新繪制或?qū)ο到y(tǒng)做出響應(yīng)。如果你太長(zhǎng)時(shí)間沒(méi)有調(diào)用事件隊(duì)列,系統(tǒng)可能會(huì)認(rèn)定你的程序已鎖定(假死)。 pygame.event.get()從隊(duì)列中獲取事件。 get() -> Eventlist get(type) -> Eventlist get(typelist) -> Eventlist 這將獲取并從隊(duì)列中刪除事件。如果指定一個(gè)或多個(gè) type 參數(shù),那么只獲取并刪除指定類(lèi)型的事件。 請(qǐng)注意,如果你只從隊(duì)列中獲取和刪除指定的事件,那么久而久之,隊(duì)列可能被你不關(guān)注的事件所填滿。 pygame.event.poll()從隊(duì)列中獲取一個(gè)事件。 poll() -> EventType instance 從隊(duì)列中返回并刪除一個(gè)事件。 如果事件隊(duì)列為空,那么會(huì)立刻返回類(lèi)型為 pygame.NOEVENT 的事件。 pygame.event.wait()等待并從隊(duì)列中獲取一個(gè)事件。 wait() -> EventType instance 從隊(duì)列中返回并刪除一個(gè)事件。如果隊(duì)列為空,那么該函數(shù)將持續(xù)等待直至隊(duì)列中有一個(gè)事件。當(dāng)程序在等待時(shí),它將保持睡眠狀態(tài)。這對(duì)于希望與其他應(yīng)用程序共享系統(tǒng)來(lái)說(shuō),是非常重要的。 pygame.event.peek()檢測(cè)某類(lèi)型事件是否在隊(duì)列中。 peek(type) -> bool peek(typelist) -> bool 如果參數(shù)指定的類(lèi)型的事件存在于隊(duì)列中,返回 True。 如果參數(shù)指定多個(gè)類(lèi)型的事件,則只需隊(duì)列中擁有其中的任何一個(gè)事件便返回 True。 pygame.event.clear()從隊(duì)列中刪除所有的事件。 clear() -> None clear(type) -> None clear(typelist) -> None 從隊(duì)列中刪除所有的事件,如果通過(guò)參數(shù)指定事件的類(lèi)型,則刪除該類(lèi)型的所有事件。該函數(shù)的效果跟 pygame.event.get() 相同,只是沒(méi)有返回任何東西。當(dāng)處理完關(guān)注的事件后,清空整個(gè)隊(duì)列可以提高一些效率。 pygame.event.event_name()通過(guò) id 獲得該事件的字符串名字。 event_name(type) -> string Pygame 通過(guò)整數(shù) id 代表事件類(lèi)型。如果你需要將這些類(lèi)型的事件展示給用戶看,那么你需要將它們轉(zhuǎn)換成字符串(一堆數(shù)字誰(shuí)知道你想表示啥?)。該函數(shù)將返回事件類(lèi)型對(duì)應(yīng)的字符串名字。返回值是以單詞大寫(xiě)的樣式(小甲魚(yú)溫馨提示:DanCiDaXieDe)。 pygame.event.set_blocked()控制哪些事件禁止進(jìn)入隊(duì)列。 set_blocked(type) -> None set_blocked(typelist) -> None set_blocked(None) -> None 參數(shù)指定的類(lèi)型的事件均不允許出現(xiàn)在事件隊(duì)列中。默認(rèn)是允許所有事件進(jìn)入隊(duì)列。多次禁止同一類(lèi)型的事件并不會(huì)引發(fā)什么問(wèn)題。 如果傳入 None,則表示允許所有的事件進(jìn)入隊(duì)列。 pygame.event.set_allowed()控制哪些事件允許進(jìn)入隊(duì)列。 set_allowed(type) -> None set_allowed(typelist) -> None set_allowed(None) -> None 參數(shù)指定的類(lèi)型的事件均允許出現(xiàn)在事件隊(duì)列中。默認(rèn)是允許所有事件進(jìn)入隊(duì)列。多次允許同一類(lèi)型的事件并不會(huì)引發(fā)什么問(wèn)題。 如果傳入 None,則表示禁止所有的事件進(jìn)入隊(duì)列。 pygame.event.get_blocked()檢測(cè)某一類(lèi)型的事件是否被禁止進(jìn)入隊(duì)列。 get_blocked(type) -> bool 如果參數(shù)指定類(lèi)型的事件被禁止進(jìn)入隊(duì)列,則返回 True。 pygame.event.set_grab()控制輸入設(shè)備與其他應(yīng)用程序的共享。 set_grab(bool) -> None 當(dāng)你的程序運(yùn)行在窗口環(huán)境中,它將與其他擁有焦點(diǎn)的應(yīng)用程序分享鼠標(biāo)和鍵盤(pán)設(shè)備的輸入。如果你的程序設(shè)置事件獨(dú)占為 True,那么你的程序?qū)㈡i定所有的輸入(小甲魚(yú)溫馨提示:不共享給其他程序了)。 最好不要經(jīng)常獨(dú)占輸入,因?yàn)檫@將阻止用戶在操作系統(tǒng)上的其他操作。 pygame.event.get_grab()檢測(cè)程序是否共享輸入設(shè)備。 get_grab() -> bool 當(dāng)程序獨(dú)占輸入事件時(shí),返回 True。使用 pygame.event.set_grab() 函數(shù)控制這一狀態(tài)。 pygame.event.post()放置一個(gè)新的事件到隊(duì)列中。 post(Event) -> None 該函數(shù)將放置一個(gè)新的事件到事件隊(duì)列的末端。這些事件將最遲被其他隊(duì)列函數(shù)獲取。 該函數(shù)通常用于放置 pygame.USEREVENT(用戶自定義事件)事件到隊(duì)列中。盡管你可以放置所有類(lèi)型的事件,但你需要確保為系統(tǒng)事件類(lèi)型相應(yīng)的屬性傳遞合適的值。 如果 SDL 事件隊(duì)列已滿,將拋出 pygame.error 異常。 pygame.event.Event()創(chuàng)建一個(gè)新的事件對(duì)象。 Event(type, dict) -> EventType instance Event(type, **attributes) -> EventType instance 根據(jù)參數(shù)給定的類(lèi)型創(chuàng)建一個(gè)新的事件。dict 參數(shù)指定事件的屬性以及相應(yīng)的值。 class pygame.event.EventType代表 SDL 事件的 Pygame 對(duì)象。 pygame.event.EventType.type — SDL event type identifier. pygame.event.EventType.__dict__ — vent object attribute dictionary 用于代表 SDL 事件的 Pygame 對(duì)象。通過(guò) pygame.event.Event() 創(chuàng)建用戶自定義事件。EventType 類(lèi)型并不是直接可以被調(diào)用的。EventType 實(shí)例對(duì)象支持屬性賦值和刪除。 typeSDL 事件類(lèi)型標(biāo)識(shí)符。 type -> int 只讀。預(yù)定義事件標(biāo)識(shí)符是 QUIT 和 MOUSEMOTION 等。對(duì)于用于創(chuàng)建的事件對(duì)象,這是傳遞給 pygame.event.Event() 的 type 參數(shù)。 __dict__事件對(duì)象的屬性字典。 __dict__ -> dict 只讀。事件類(lèi)型指定的屬性。例如,KEYDOWN 事件包含 unicode,key 和 mod 屬性。 可變屬性是 Pygame 1.9.2 新增加的。 |
|