一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Pygame詳解(四):event 模塊

 王企鵝薔薇 2022-08-25 發(fā)布于陜西

pygame.event

用于處理事件與事件隊(duì)列的 Pygame 模塊。

函數(shù)

  • pygame.event.pump()  —  讓 Pygame 內(nèi)部自動(dòng)處理事件

  • pygame.event.get()  —  從隊(duì)列中獲取事件

  • pygame.event.poll()  —  從隊(duì)列中獲取一個(gè)事件

  • pygame.event.wait()  —  等待并從隊(duì)列中獲取一個(gè)事件

  • pygame.event.peek()  —  檢測(cè)某類(lèi)型事件是否在隊(duì)列中

  • pygame.event.clear()  —  從隊(duì)列中刪除所有的事件

  • pygame.event.event_name()  —  通過(guò) id 獲得該事件的字符串名字

  • pygame.event.set_blocked()  —  控制哪些事件禁止進(jìn)入隊(duì)列

  • pygame.event.set_allowed()  —  控制哪些事件允許進(jìn)入隊(duì)列

  • pygame.event.get_blocked()  —  檢測(cè)某一類(lèi)型的事件是否被禁止進(jìn)入隊(duì)列

  • pygame.event.set_grab()  —  控制輸入設(shè)備與其他應(yīng)用程序的共享

  • pygame.event.get_grab()  —  檢測(cè)程序是否共享輸入設(shè)備

  • pygame.event.post()  —  放置一個(gè)新的事件到隊(duì)列中

  • pygame.event.Event()  —  創(chuàng)建一個(gè)新的事件對(duì)象

  • pygame.event.EventType  —  代表 SDL 事件的 Pygame 對(duì)象

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)的成員屬性列表:

事件類(lèi)型

成員屬性

QUITnone
ACTIVEEVENTgain, state
KEYDOWNunicode, key, mod
KEYUPkey, mod
MOUSEMOTIONpos, rel, buttons
MOUSEBUTTONUPpos, button
MOUSEBUTTONDOWNpos, button
JOYAXISMOTIONjoy, axis, value
JOYBALLMOTIONjoy, ball, rel
JOYHATMOTIONjoy, hat, value
JOYBUTTONUPjoy, button
JOYBUTTONDOWNjoy, button
VIDEORESIZEsize, w, h
VIDEOEXPOSEnone
USEREVENTcode

事件支持等值比較。如果兩個(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ì)象支持屬性賦值和刪除。

type

SDL 事件類(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 新增加的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    2019年国产最新视频| 熟女免费视频一区二区| 日本视频在线观看不卡| 日韩人妻精品免费一区二区三区| 国产不卡在线免费观看视频| 国产日韩综合一区在线观看| 激情丁香激情五月婷婷| 欧美一区二区三区不卡高清视| 亚洲a级一区二区不卡| 高中女厕偷拍一区二区三区| 亚洲国产一区精品一区二区三区色| 久久婷婷综合色拍亚洲| 日韩欧美综合中文字幕| 超薄丝袜足一区二区三区| 欧美午夜视频免费观看| 激情内射亚洲一区二区三区| 免费国产成人性生活生活片| 日韩三极片在线免费播放| 91免费精品国自产拍偷拍| 麻豆在线观看一区二区| 欧美午夜一区二区福利视频| 国产又长又粗又爽免费视频 | 欧美一本在线免费观看| 久久三级国外久久久三级| 久久大香蕉一区二区三区| 欧美三级不卡在线观线看| 亚洲三级视频在线观看免费| 日韩精品综合福利在线观看| 亚洲一区在线观看蜜桃| 欧美不卡高清一区二区三区| 久久大香蕉精品在线观看| 日本人妻熟女一区二区三区| 大胆裸体写真一区二区| 日韩成人高清免费在线| 激情内射亚洲一区二区三区| 国产精品熟女乱色一区二区| 亚洲内射人妻一区二区| 亚洲精品一二三区不卡| 日韩日韩欧美国产精品| 欧美日韩人妻中文一区二区| 色婷婷日本视频在线观看|