Pygame Event事件模塊

2022-04-20 18:04 更新

事件(Event)是 Pygame 的重要模塊之一,它是構(gòu)建整個(gè)游戲程序的核心,比如鼠標(biāo)點(diǎn)擊、鍵盤(pán)敲擊、游戲窗口移動(dòng)、調(diào)整窗口大小、觸發(fā)特定的情節(jié)、退出游戲等等,這些都可以看做是“事件”,Pygame 會(huì)接受用戶產(chǎn)生的各種操作(或事件),這些操作隨時(shí)產(chǎn)生,并且操作量可大可小,那么 Pygame 是如何處理這些事件的呢?

事件類(lèi)型

Pygame 定義了一個(gè)專(zhuān)門(mén)用來(lái)處理事件的結(jié)構(gòu),即事件隊(duì)列,該結(jié)構(gòu)遵循遵循隊(duì)列“先到先處理”的基本原則,通過(guò)事件隊(duì)列,我們可以有序的、逐一的處理用戶的操作(觸發(fā)事件)。下述表格列出了 Pygame 中常用的游戲事件:



事件類(lèi)型描述成員屬性
QUIT用戶按下窗口的關(guān)閉按鈕none
ATIVEEVENTPygame被激活或者隱藏gain,state
KEYDOWN鍵盤(pán)按下unicode、key、mod
KEYUP鍵盤(pán)放開(kāi)key、mod
MOUSEMOTION鼠標(biāo)移動(dòng)  pos, rel, buttons
MOUSEBUTTONDOWN鼠標(biāo)按下 pos, button
MOUSEBUTTONUP鼠標(biāo)放開(kāi) pos, button
JOYAXISMOTION游戲手柄(Joystick or pad) 移動(dòng) joy, axis, value
JOYBALLMOTION 游戲球(Joy ball) 移動(dòng)  joy, axis, value
JOYHATMOTION游戲手柄(Joystick) 移動(dòng)    joy, axis, value
JOYBUTTONDOWN游戲手柄按下joy, button
JOYBUTTONUP游戲手柄放開(kāi)    joy, button
VIDEORESIZEPygame窗口縮放  size, w, h
VIDEOEXPOSEPygame窗口部分公開(kāi)(expose) none
USEREVENT觸發(fā)一個(gè)用戶事件  事件代碼

注意,當(dāng)使用 Pygame 做游戲開(kāi)發(fā)時(shí),上述事件并非都會(huì)應(yīng)用的到,因此在學(xué)習(xí)的過(guò)程中,我們要懂得觸類(lèi)旁通、舉一反三。

事件處理方法

Pygame.event 模塊提供了處理事件隊(duì)列的常用方法,如下表所示:



方法說(shuō)明
pygame.event.get()從事件隊(duì)列中獲取一個(gè)事件,并從隊(duì)列中刪除該事件
pygame.event.wait() 阻塞直至事件發(fā)生才會(huì)繼續(xù)執(zhí)行,若沒(méi)有事件發(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 會(huì)自動(dòng)處理事件隊(duì)列
pygame.event.poll() 會(huì)根據(jù)實(shí)際情形返回一個(gè)真實(shí)的事件,或者一個(gè)None
pygame.event.peek()  檢測(cè)某類(lèi)型事件是否在隊(duì)列中
pygame.event.clear()從隊(duì)列中清除所有的事件
pygame.event.get_blocked() 檢測(cè)某一類(lèi)型的事件是否被禁止進(jìn)入隊(duì)列
pygame.event.post()  放置一個(gè)新的事件到隊(duì)列中
pygame.event.Event()  創(chuàng)建一個(gè)用戶自定義的新事件

當(dāng)我們使用 Pygame 處理事件時(shí),邏輯一般都是相似的。首先是判斷事件的類(lèi)型,然后根據(jù)不同的事件操作,執(zhí)行不同的游戲操作。因此這種情況非常適合使用 if ... else 語(yǔ)句。如下所示:


下面應(yīng)用上述方法對(duì)鼠標(biāo)事件和鍵盤(pán)事件分別做簡(jiǎn)單的介紹。

處理鍵盤(pán)事件

鍵盤(pán)事件會(huì)涉及到大量的按鍵操作,比如游戲中的上下左右,或者人物的前進(jìn)、后退等操作,這些都需要鍵盤(pán)來(lái)配合實(shí)現(xiàn)。



鍵盤(pán)事件提供了一個(gè) key 屬性,通過(guò)該屬性可以獲取鍵盤(pán)的按鍵。Pygame 將鍵盤(pán)上的字母鍵、數(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)移動(dòng)')
        # 鍵盤(pán)事件
    if event.type ==pygame.KEYDOWN:
        # 打印按鍵的英文字符
        print('鍵盤(pán)按下',chr(event.key))
    if event.type == pygame.KEYUP:
        print('鍵盤(pán)彈起')
    ....

常量名描述
K_BACKSPACE退格鍵(Backspace)
K_TAB制表鍵(Tab)
K_CLEAR清除鍵(Clear)
K_RETURN回車(chē)鍵(Enter)
K_PAUSE暫停鍵(Pause)
K_ESCAPE退出鍵(Escape)
K_SPACE空格鍵(Space)
K_0...K_90...9
K_a...Kza...z
K_DELETE刪除鍵(delete)
K_KP0...K_KP90(小鍵盤(pán))...9(小鍵盤(pán))
K_F1...K_F15F1...F15
K_UP向上箭頭(up arrow)
K_DOWN向下箭頭(down arrow)
K_RIGHT向右箭頭(right arrow)
K_LEFT向左箭頭(left arrow)
KMOD_ALT同時(shí)按下Alt鍵

想要了解更多按鍵常量可參考官方文檔,這里有您想要的更多知識(shí) ———> 點(diǎn)擊前往。

下面通過(guò)“圖片移動(dòng)”示例來(lái)了解鍵盤(pán)事件的處理過(guò)程,如下所示:


程序運(yùn)行結(jié)果如下:


pygame event事件圖像移動(dòng)


圖1:Pygame鍵盤(pán)事件——圖像移動(dòng)

處理鼠標(biāo)事件

鼠標(biāo)是計(jì)算機(jī)最重要外接設(shè)備之一,同時(shí)它也是游戲玩家必不可少的工具之一。Pygame 提供了三個(gè)鼠標(biāo)事件,分別是鼠標(biāo)移動(dòng)(MOUSEMOTION)、鼠標(biāo)按下(MOUSEBUTTONDOWN)、鼠標(biāo)釋放(MOUSEBUTTONUP),不同事件類(lèi)型對(duì)應(yīng)著不同的成員屬性。如下所示:

pygame.event.MOUSEMOTION鼠標(biāo)移動(dòng)事件

    event.pos 相對(duì)于窗口左上角,鼠標(biāo)的當(dāng)前坐標(biāo)值(x,y)
    event.rel 鼠標(biāo)相對(duì)運(yùn)動(dòng)距離(X,Y),相對(duì)于上次事件
    event.buttons 鼠標(biāo)按鈕初始狀態(tài)(0,0,0),分別對(duì)應(yīng)(左鍵,滑輪,右鍵),移動(dòng)過(guò)程中點(diǎn)擊那個(gè)鍵,相應(yīng)位置變會(huì)為1

pygame.event.MOUSEBUTTONUP鼠標(biāo)鍵釋放事件

    event.pos 相對(duì)于窗口左上角,鼠標(biāo)的當(dāng)前坐標(biāo)值(x,y)
    event.button 鼠標(biāo)釋放鍵編號(hào)(整數(shù))左鍵為1,按下滾動(dòng)輪2、右鍵為3

pygame.event.MOUSEBUTTONDOWN 鼠標(biāo)鍵按下事件

    event.pos 相對(duì)于窗口左上角,鼠標(biāo)的當(dāng)前坐標(biāo)值(x,y)
    event.button 鼠標(biāo)按下鍵編號(hào)(整數(shù)),左鍵為1,按下滾動(dòng)輪2、右鍵為3,向前滾動(dòng)滑輪4、向后滾動(dòng)滑輪5

通過(guò)一組簡(jiǎn)單的示例對(duì)鼠標(biāo)事件進(jìn)行演示,示例代碼如下:

import pygame
from random import randint
# 初始化程序
pygame.init()
screen = pygame.display.set_mode((450,400))
pygame.display.set_caption("c語(yǔ)言中文網(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 模塊畫(huà)圓
        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)移動(dòng)')
        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é)果如下:


pygame鼠標(biāo)事件


圖2:Pygame鼠標(biāo)事件——鼠標(biāo)移動(dòng)


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)