更新時(shí)間:2022-12-22 來源:黑馬程序員 瀏覽量:
游戲需要與玩家交互,因此它必須能夠接收玩家的操作,并根據(jù)玩家操作有針對(duì)性地做出響應(yīng)。程序開發(fā)中將玩家會(huì)對(duì)游戲進(jìn)行的操作稱為事件(Event),根據(jù)輸入媒介的不同,游戲中的事件分為鍵盤事件、鼠標(biāo)事件和手柄事件等。pygame在子模塊locals中對(duì)事件進(jìn)行了更加細(xì)致的定義,鍵盤事件、鼠標(biāo)事件及其產(chǎn)生途徑和參數(shù)如下表所示。
由表上表可知,pygame.locals中的鍵盤事件分為KEYDOWN和KEYUP.這兩個(gè)事件的參數(shù)描述如下。
(1)unicode:記錄按鍵的Unicode值。
(2)key:按下或放開的鍵的鍵值,鍵值是一個(gè)數(shù)字,但為了方便使用,pygame中支持以K_xx來表示按鍵,例如,字母鍵表示為K_a、K_b等,方向鍵表示為K_UP、K_DOWN、K_LEFT、K_RIGHT,ESC鍵表示為K_ESCAPE(更多按鍵表示請(qǐng)參見pygame手冊(cè))。
(3)mod:包含組合鍵信息,例如mod&KMOD_CTRL為真,表示用戶在按下其他鍵的同時(shí)按下了Ctrl鍵。類似的還有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)滾輪。
程序可通過pygame子模塊event中的type屬性判斷事件類型,通過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)放開事件 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:#如果有按鍵放開事件 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)中通過for 循環(huán)遍歷事件,對(duì)每層for循環(huán)取出的事件event進(jìn)行判斷,若當(dāng)前事件為鼠標(biāo)放開事件(MOUSEBUTTONUP),說明鼠標(biāo)按鍵曾被按下,此時(shí)使用Rect類的collidepoint()方法判斷點(diǎn)擊的位置event.pos與方塊、按鈕的關(guān)系,輸出相應(yīng)信息;若當(dāng)前事件為按鍵放開事件(KEYUP),說明鍵盤按鍵曾被按下,此時(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ū)域 退出游戲 ← → ↑ ↓
此處的示例僅為展示游戲開發(fā)中的事件處理流程,并未詳細(xì)講解如何選擇要處理的事件以及事件的詳細(xì)處理,皆因需求決定程序走向,程序代碼總是與程序的功能息息相關(guān)。