首頁常見問題正文

Python培訓:pygame事件處理機制詳解

更新時間:2022-12-22 來源:黑馬程序員 瀏覽量:

IT培訓班

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

pygame產(chǎn)生背景

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

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

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

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

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

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

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

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

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

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

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

````
#獲取點擊事件,rect.collodepoint(),判斷點擊位置
while True:
    FPSCLOCK.tick (FPS)
    for event in pygame.event.get():
         if event.type == MOUSEBUTTONUP:            #如果有鼠標放開事件
             if blockRect.collidepoint(event.pos): #凈如果點擊的是方塊
                 print('點擊了方塊')
             elif autoRect.collidepoint (event.pos):
                 print('點擊了按鈕')
             else:
                 print('點擊了空白區(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)遍歷事件,對每層for循環(huán)取出的事件event進行判斷,若當前事件為鼠標放開事件(MOUSEBUTTONUP),說明鼠標按鍵曾被按下,此時使用Rect類的collidepoint()方法判斷點擊的位置event.pos與方塊、按鈕的關系,輸出相應信息;若當前事件為按鍵放開事件(KEYUP),說明鍵盤按鍵曾被按下,此時根據(jù)event.key屬性判斷曾被按下的具體按鍵,根據(jù)按鍵打印相應的信息,或退出程序。執(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)>
點擊了方塊
點擊了按鈕
點擊了空白區(qū)域
退出游戲
←
→
↑
↓

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

分享到:
在線咨詢 我要報名
和我們在線交談!