Pygame Event事件模塊的詳細示例

事件(Event)是 Pygame 的重要模塊之一,它是構建整個遊戲程序的核心,比如鼠標點擊、鍵盤敲擊、遊戲窗口移動、調整窗口大小、觸發特定的情節、退出遊戲等等,這些都可以看做是“事件”,Pygame 會接受用戶產生的各種操作(或事件),這些操作隨時產生,並且操作量可大可小,那麼 Pygame 是如何處理這些事件的呢?

事件類型

Pygame 定義瞭一個專門用來處理事件的結構,即事件隊列,該結構遵循遵循隊列“先到先處理”的基本原則,通過事件隊列,我們可以有序的、逐一的處理用戶的操作(觸發事件)。下述表格列出瞭 Pygame 中常用的遊戲事件:

事件類型 描述 成員屬性
QUIT 用戶按下窗口的關閉按鈕 none
ATIVEEVENT Pygame被激活或者隱藏 gain,state
KEYDOWN 鍵盤按下 unicode、key、mod
KEYUP 鍵盤放開 key、mod
MOUSEMOTION 鼠標移動   pos, rel, buttons
MOUSEBUTTONDOWN 鼠標按下  pos, button
MOUSEBUTTONUP 鼠標放開  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 觸發一個用戶事件   事件代碼

註意,當使用 Pygame 做遊戲開發時,上述事件並非都會應用的到,因此在學習的過程中,我們要懂得觸類旁通、舉一反三。

事件處理方法

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

方法 說明
pygame.event.get() 從事件隊列中獲取一個事件,並從隊列中刪除該事件
pygame.event.wait()  阻塞直至事件發生才會繼續執行,若沒有事件發生將一直處於阻塞狀態
pygame.event.set_blocked()  控制哪些事件禁止進入隊列,如果參數值為None,則表示禁止所有事件進入
pygame.event.set_allowed()   控制哪些事件允許進入隊列
pygame.event.pump()  調用該方法後,Pygame 會自動處理事件隊列
pygame.event.poll()  會根據實際情形返回一個真實的事件,或者一個None
pygame.event.peek()   檢測某類型事件是否在隊列中
pygame.event.clear() 從隊列中清除所有的事件
pygame.event.get_blocked()  檢測某一類型的事件是否被禁止進入隊列
pygame.event.post()   放置一個新的事件到隊列中
pygame.event.Event()   創建一個用戶自定義的新事件

當我們使用 Pygame 處理事件時,邏輯一般都是相似的。首先是判斷事件的類型,然後根據不同的事件操作,執行不同的遊戲操作。因此這種情況非常適合使用 if … else 語句。如下所示:

while True:
    #等待事件發生
    event = pygame.event.wait()
    if event.type == pygame.QUIT:
        exit()
    if event.type == pygame.MOUSEBUTTONDOWN:
        print('鼠標按下',event.pos)
    if event.type == pygame.MOUSEBUTTONUP:
        print('鼠標彈起')
    if event.type == pygame.MOUSEMOTION:
        print('鼠標移動')
        # 鍵盤事件
    if event.type ==pygame.KEYDOWN:
        # 打印按鍵的英文字符
        print('鍵盤按下',chr(event.key))
    if event.type == pygame.KEYUP:
        print('鍵盤彈起')
    ....

下面應用上述方法對鼠標事件和鍵盤事件分別做簡單的介紹。

處理鍵盤事件

鍵盤事件會涉及到大量的按鍵操作,比如遊戲中的上下左右,或者人物的前進、後退等操作,這些都需要鍵盤來配合實現。

鍵盤事件提供瞭一個 key 屬性,通過該屬性可以獲取鍵盤的按鍵。Pygame 將鍵盤上的字母鍵、數字鍵、組合鍵等按鍵以常量的方式進行瞭定義,下表列出瞭部分常用按鍵的常量:

常量名 描述
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鍵

想要瞭解更多按鍵常量可參考官方文檔,這裡有您想要的更多知識 ———> 點擊前往。

下面通過“圖片移動”示例來瞭解鍵盤事件的處理過程,如下所示:

import pygame
import sys
# 初始化pygame
pygame.init()
# 定義變量
size = width, height = 600, 400
bg = (255, 255, 255)
# 加載logo圖
img = pygame.image.load("C:/Users/Administrator/Desktop/logo.jpg")
# 獲取圖像的位置
position = img.get_rect()
# 創建一個主窗口
screen = pygame.display.set_mode(size)
# 標題
pygame.display.set_caption("C語言中文網")
# 創建遊戲主循環
while True:
    # 設置初始值
    site = [0, 0]
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        # 圖像移動 KEYDOWN 鍵盤按下事件
        # 通過 key 屬性對應按鍵
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                site[1] -= 8
            if event.key == pygame.K_DOWN:
                site[1] += 8
            if event.key == pygame.K_LEFT:
                site[0] -= 8
            if event.key == pygame.K_RIGHT:
                site[0] += 8
    # 移動圖像
    position = position.move(site)
    # 填充背景
    screen.fill(bg)
    # 放置圖片
    screen.blit(img, position)
    # 更新顯示界面
    pygame.display.flip()

程序運行結果如下:

圖1:Pygame鍵盤事件——圖像移動

處理鼠標事件

鼠標是計算機最重要外接設備之一,同時它也是遊戲玩傢必不可少的工具之一。

Pygame 提供瞭三個鼠標事件,分別是鼠標移動(MOUSEMOTION)、鼠標按下(MOUSEBUTTONDOWN)、鼠標釋放(MOUSEBUTTONUP),不同事件類型對應著不同的成員屬性。如下所示:

pygame.event.MOUSEMOTION鼠標移動事件

    event.pos 相對於窗口左上角,鼠標的當前坐標值(x,y)
    event.rel 鼠標相對運動距離(X,Y),相對於上次事件
    event.buttons 鼠標按鈕初始狀態(0,0,0),分別對應(左鍵,滑輪,右鍵),移動過程中點擊那個鍵,相應位置變會為1

pygame.event.MOUSEBUTTONUP鼠標鍵釋放事件

    event.pos 相對於窗口左上角,鼠標的當前坐標值(x,y)
    event.button 鼠標釋放鍵編號(整數)左鍵為1,按下滾動輪2、右鍵為3

pygame.event.MOUSEBUTTONDOWN 鼠標鍵按下事件

    event.pos 相對於窗口左上角,鼠標的當前坐標值(x,y)
    event.button 鼠標按下鍵編號(整數),左鍵為1,按下滾動輪2、右鍵為3,向前滾動滑輪4、向後滾動滑輪5

通過一組簡單的示例對鼠標事件進行演示,示例代碼如下:

程序運行結果如下:

圖2:Pygame鼠標事件——鼠標移動

到此這篇關於Pygame Event事件模塊的詳細示例的文章就介紹到這瞭,更多相關Pygame Event內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: