事件(Event)是 Pygame 的重要模塊之一,它是構(gòu)建整個游戲程序的核心,比如鼠標(biāo)點(diǎn)擊、鍵盤敲擊、游戲窗口移動、調(diào)整窗口大小、觸發(fā)特定的情節(jié)、退出游戲等等,這些都可以看做是“事件”,Pygame 會接受用戶產(chǎn)生的各種操作(或事件),這些操作隨時產(chǎn)生,并且操作量可大可小,那么 Pygame 是如何處理這些事件的呢?
Pygame 定義了一個專門用來處理事件的結(jié)構(gòu),即事件隊(duì)列,該結(jié)構(gòu)遵循遵循隊(duì)列“先到先處理”的基本原則,通過事件隊(duì)列,我們可以有序的、逐一的處理用戶的操作(觸發(fā)事件)。下述表格列出了 Pygame 中常用的游戲事件:
事件類型 | 描述 | 成員屬性 |
---|---|---|
QUIT | 用戶按下窗口的關(guān)閉按鈕 | none |
ATIVEEVENT | Pygame被激活或者隱藏 | gain,state |
KEYDOWN | 鍵盤按下 | unicode、key、mod |
KEYUP | 鍵盤放開 | key、mod |
MOUSEMOTION | 鼠標(biāo)移動 | pos, rel, buttons |
MOUSEBUTTONDOWN | 鼠標(biāo)按下 | pos, button |
MOUSEBUTTONUP | 鼠標(biāo)放開 | pos, button |
JOYAXISMOTION | 游戲手柄(Joystick or pad) 移動 | joy, axis, value |
JOYBALLMOTION | 游戲球(Joy ball) 移動 | joy, axis, value |
JOYHATMOTION | 游戲手柄(Joystick) 移動 | joy, axis, value |
JOYBUTTONDOWN | 游戲手柄按下 | joy, button |
JOYBUTTONUP | 游戲手柄放開 | joy, button |
VIDEORESIZE | Pygame窗口縮放 | size, w, h |
VIDEOEXPOSE | Pygame窗口部分公開(expose) | none |
USEREVENT | 觸發(fā)一個用戶事件 | 事件代碼 |
注意,當(dāng)使用 Pygame 做游戲開發(fā)時,上述事件并非都會應(yīng)用的到,因此在學(xué)習(xí)的過程中,我們要懂得觸類旁通、舉一反三。
Pygame.event 模塊提供了處理事件隊(duì)列的常用方法,如下表所示:
方法 | 說明 |
---|---|
pygame.event.get() | 從事件隊(duì)列中獲取一個事件,并從隊(duì)列中刪除該事件 |
pygame.event.wait() | 阻塞直至事件發(fā)生才會繼續(xù)執(zhí)行,若沒有事件發(fā)生將一直處于阻塞狀態(tài) |
pygame.event.set_blocked() | 控制哪些事件禁止進(jìn)入隊(duì)列,如果參數(shù)值為None,則表示禁止所有事件進(jìn)入 |
pygame.event.set_allowed() | 控制哪些事件允許進(jìn)入隊(duì)列 |
pygame.event.pump() | 調(diào)用該方法后,Pygame 會自動處理事件隊(duì)列 |
pygame.event.poll() | 會根據(jù)實(shí)際情形返回一個真實(shí)的事件,或者一個None |
pygame.event.peek() | 檢測某類型事件是否在隊(duì)列中 |
pygame.event.clear() | 從隊(duì)列中清除所有的事件 |
pygame.event.get_blocked() | 檢測某一類型的事件是否被禁止進(jìn)入隊(duì)列 |
pygame.event.post() | 放置一個新的事件到隊(duì)列中 |
pygame.event.Event() | 創(chuàng)建一個用戶自定義的新事件 |
當(dāng)我們使用 Pygame 處理事件時,邏輯一般都是相似的。首先是判斷事件的類型,然后根據(jù)不同的事件操作,執(zhí)行不同的游戲操作。因此這種情況非常適合使用 if ... else 語句。如下所示:
下面應(yīng)用上述方法對鼠標(biāo)事件和鍵盤事件分別做簡單的介紹。
鍵盤事件會涉及到大量的按鍵操作,比如游戲中的上下左右,或者人物的前進(jìn)、后退等操作,這些都需要鍵盤來配合實(shí)現(xiàn)。
鍵盤事件提供了一個 key 屬性,通過該屬性可以獲取鍵盤的按鍵。Pygame 將鍵盤上的字母鍵、數(shù)字鍵、組合鍵等按鍵以常量的方式進(jìn)行了定義,下表列出了部分常用按鍵的常量:
while True:
#等待事件發(fā)生
event = pygame.event.wait()
if event.type == pygame.QUIT:
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
print('鼠標(biāo)按下',event.pos)
if event.type == pygame.MOUSEBUTTONUP:
print('鼠標(biāo)彈起')
if event.type == pygame.MOUSEMOTION:
print('鼠標(biāo)移動')
# 鍵盤事件
if event.type ==pygame.KEYDOWN:
# 打印按鍵的英文字符
print('鍵盤按下',chr(event.key))
if event.type == pygame.KEYUP:
print('鍵盤彈起')
....
常量名 | 描述 |
---|---|
K_BACKSPACE | 退格鍵(Backspace) |
K_TAB | 制表鍵(Tab) |
K_CLEAR | 清除鍵(Clear) |
K_RETURN | 回車鍵(Enter) |
K_PAUSE | 暫停鍵(Pause) |
K_ESCAPE | 退出鍵(Escape) |
K_SPACE | 空格鍵(Space) |
K_0...K_9 | 0...9 |
K_a...Kz | a...z |
K_DELETE | 刪除鍵(delete) |
K_KP0...K_KP9 | 0(小鍵盤)...9(小鍵盤) |
K_F1...K_F15 | F1...F15 |
K_UP | 向上箭頭(up arrow) |
K_DOWN | 向下箭頭(down arrow) |
K_RIGHT | 向右箭頭(right arrow) |
K_LEFT | 向左箭頭(left arrow) |
KMOD_ALT | 同時按下Alt鍵 |
想要了解更多按鍵常量可參考官方文檔,這里有您想要的更多知識 ———> 點(diǎn)擊前往。
下面通過“圖片移動”示例來了解鍵盤事件的處理過程,如下所示:
程序運(yùn)行結(jié)果如下:
圖1:Pygame鍵盤事件——圖像移動
鼠標(biāo)是計算機(jī)最重要外接設(shè)備之一,同時它也是游戲玩家必不可少的工具之一。Pygame 提供了三個鼠標(biāo)事件,分別是鼠標(biāo)移動(MOUSEMOTION)、鼠標(biāo)按下(MOUSEBUTTONDOWN)、鼠標(biāo)釋放(MOUSEBUTTONUP),不同事件類型對應(yīng)著不同的成員屬性。如下所示:
pygame.event.MOUSEMOTION鼠標(biāo)移動事件 event.pos 相對于窗口左上角,鼠標(biāo)的當(dāng)前坐標(biāo)值(x,y) event.rel 鼠標(biāo)相對運(yùn)動距離(X,Y),相對于上次事件 event.buttons 鼠標(biāo)按鈕初始狀態(tài)(0,0,0),分別對應(yīng)(左鍵,滑輪,右鍵),移動過程中點(diǎn)擊那個鍵,相應(yīng)位置變會為1 pygame.event.MOUSEBUTTONUP鼠標(biāo)鍵釋放事件 event.pos 相對于窗口左上角,鼠標(biāo)的當(dāng)前坐標(biāo)值(x,y) event.button 鼠標(biāo)釋放鍵編號(整數(shù))左鍵為1,按下滾動輪2、右鍵為3 pygame.event.MOUSEBUTTONDOWN 鼠標(biāo)鍵按下事件 event.pos 相對于窗口左上角,鼠標(biāo)的當(dāng)前坐標(biāo)值(x,y) event.button 鼠標(biāo)按下鍵編號(整數(shù)),左鍵為1,按下滾動輪2、右鍵為3,向前滾動滑輪4、向后滾動滑輪5
通過一組簡單的示例對鼠標(biāo)事件進(jìn)行演示,示例代碼如下:
import pygame
from random import randint
# 初始化程序
pygame.init()
screen = pygame.display.set_mode((450,400))
pygame.display.set_caption("c語言中文網(wǎng)")
# 更新顯示
pygame.display.flip()
while True:
#等待事件發(fā)生
event = pygame.event.wait()
if event.type == pygame.QUIT:
exit("成功退出")
if event.type == pygame.MOUSEBUTTONDOWN:
# pos 獲取鼠標(biāo)當(dāng)前位置
print('鼠標(biāo)按下',event.pos)
mx,my = event.pos
# 調(diào)用 pygame.draw 模塊畫圓
pygame.draw.circle(screen,(255,255,0),(mx,my),50)
# 處理完,更新顯示
pygame.display.update()
if event.type == pygame.MOUSEBUTTONUP:
print('鼠標(biāo)彈起')
pass
if event.type == pygame.MOUSEMOTION:
print('鼠標(biāo)移動')
mx, my = event.pos
# 隨機(jī)生成 RGB 顏色值
r = randint(0,255)
g = randint(0,255)
b = randint(0,255)
pygame.draw.circle(screen, (r,g,b,),(mx, my), 50)
# 處理完,更新顯示
pygame.display.update()
程序運(yùn)行結(jié)果如下:
圖2:Pygame鼠標(biāo)事件——鼠標(biāo)移動
更多建議: