全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)常見(jiàn)問(wèn)題正文

Python培訓(xùn):pygame事件處理機(jī)制詳解

更新時(shí)間:2022-12-22 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

游戲需要與玩家交互,因此它必須能夠接收玩家的操作,并根據(jù)玩家操作有針對(duì)性地做出響應(yīng)。程序開(kāi)發(fā)中將玩家會(huì)對(duì)游戲進(jìn)行的操作稱(chēng)為事件(Event),根據(jù)輸入媒介的不同,游戲中的事件分為鍵盤(pán)事件、鼠標(biāo)事件和手柄事件等。pygame在子模塊locals中對(duì)事件進(jìn)行了更加細(xì)致的定義,鍵盤(pán)事件、鼠標(biāo)事件及其產(chǎn)生途徑和參數(shù)如下表所示。

pygame產(chǎn)生背景

由表上表可知,pygame.locals中的鍵盤(pán)事件分為KEYDOWN和KEYUP.這兩個(gè)事件的參數(shù)描述如下。

(1)unicode:記錄按鍵的Unicode值。

(2)key:按下或放開(kāi)的鍵的鍵值,鍵值是一個(gè)數(shù)字,但為了方便使用,pygame中支持以K_xx來(lái)表示按鍵,例如,字母鍵表示為K_a、K_b等,方向鍵表示為K_UP、K_DOWN、K_LEFT、K_RIGHT,ESC鍵表示為K_ESCAPE(更多按鍵表示請(qǐng)參見(jiàn)pygame手冊(cè))。

(3)mod:包含組合鍵信息,例如mod&KMOD_CTRL為真,表示用戶(hù)在按下其他鍵的同時(shí)按下了Ctrl鍵。類(lèi)似的還有KMOD_SHIFT、KMOD_ALT。

Pygame.locals中的鼠標(biāo)事件分為MOUSEMOTION、MOUSEBUTTONDOWN、MOU SEBUTTONUP,這3個(gè)事件的參數(shù)描述如下。

(l)pos:鼠標(biāo)操作的位置,該參數(shù)是一個(gè)包含橫坐標(biāo)x和縱坐標(biāo)y的元組。

(2)rel:當(dāng)前位置與上次產(chǎn)生鼠標(biāo)事件時(shí)鼠標(biāo)指針位置間的距離。

(3)buttons:一個(gè)含有3個(gè)數(shù)字的元組,元組中數(shù)字的取值只能為0或1,3個(gè)數(shù)字依次表示左鍵、滾輪和右鍵。若僅移動(dòng)鼠標(biāo),則buttons的值為(1,0,0);若鼠標(biāo)移動(dòng)的同時(shí)單擊鼠標(biāo)的某個(gè)按鍵,元組中與該鍵對(duì)應(yīng)的值更改為1,例如按下鼠標(biāo)左鍵,buttons的值為(1,0,0)。

(4)button:整型數(shù)值,1表示單擊鼠標(biāo)左鍵,2表示單擊滾輪,3表示單擊右鍵,4表示向上滑動(dòng)滾輪,5表示向下滑動(dòng)滾輪。

程序可通過(guò)pygame子模塊event中的type屬性判斷事件類(lèi)型,通過(guò)get()函數(shù)獲取當(dāng)前時(shí)刻產(chǎn)生的所有事件的列表。當(dāng)然,并非事件列表中的事件都需要關(guān)心和處理,程序通常在循環(huán)中遍歷事件列表,將其中的元素與需要處理的事件常量進(jìn)行比對(duì),若當(dāng)前事件為需要處理的事件,再對(duì)其進(jìn)行相應(yīng)操作。

在程序7_pg_test.py中添加事件處理代碼,具體如下所示:

````
#獲取點(diǎn)擊事件,rect.collodepoint(),判斷點(diǎn)擊位置
while True:
    FPSCLOCK.tick (FPS)
    for event in pygame.event.get():
         if event.type == MOUSEBUTTONUP:            #如果有鼠標(biāo)放開(kāi)事件
             if blockRect.collidepoint(event.pos): #凈如果點(diǎn)擊的是方塊
                 print('點(diǎn)擊了方塊')
             elif autoRect.collidepoint (event.pos):
                 print('點(diǎn)擊了按鈕')
             else:
                 print('點(diǎn)擊了空白區(qū)域')
elif event.type == KEYUP:#如果有按鍵放開(kāi)事件
             if event.key in (K_LEFT,K_a):
                 print('←')
             elif event.key in (K_RIGHT, K_d):
                 print('→')
             elif event.key in (K_UP, K_w):
                 print('↑')
             elif event.key in (K_DOWN, K_s):
                 print('↓')
             elif event.key ==K_ESCAPE:
                 print('退出游戲')
                 pygame.quit()
pygame.quit()

以上代碼在while循環(huán)中通過(guò)for 循環(huán)遍歷事件,對(duì)每層for循環(huán)取出的事件event進(jìn)行判斷,若當(dāng)前事件為鼠標(biāo)放開(kāi)事件(MOUSEBUTTONUP),說(shuō)明鼠標(biāo)按鍵曾被按下,此時(shí)使用Rect類(lèi)的collidepoint()方法判斷點(diǎn)擊的位置event.pos與方塊、按鈕的關(guān)系,輸出相應(yīng)信息;若當(dāng)前事件為按鍵放開(kāi)事件(KEYUP),說(shuō)明鍵盤(pán)按鍵曾被按下,此時(shí)根據(jù)event.key屬性判斷曾被按下的具體按鍵,根據(jù)按鍵打印相應(yīng)的信息,或退出程序。執(zhí)行程序,依次執(zhí)行循環(huán)中的判斷條件,程序打印結(jié)果如下:

·pypygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html
<rect (290, 210, 60, 60)>
點(diǎn)擊了方塊
點(diǎn)擊了按鈕
點(diǎn)擊了空白區(qū)域
退出游戲
←
→
↑
↓

此處的示例僅為展示游戲開(kāi)發(fā)中的事件處理流程,并未詳細(xì)講解如何選擇要處理的事件以及事件的詳細(xì)處理,皆因需求決定程序走向,程序代碼總是與程序的功能息息相關(guān)。

分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!