首頁 > 軟體

Python之Pygame的Event事件模組

2023-04-04 06:00:58

Pygame的Event事件模組

事件(Event)是 Pygame 的重要模組之一,它是構建整個遊戲程式的核心,比如常用的滑鼠點選、鍵盤敲擊、遊戲視窗移動、調整視窗大小、觸發特定的情節、退出遊戲等,這些都可以看做是“事件”。

 事件型別

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

名稱說明
QUIT使用者按下視窗的關閉按鈕
ATIVEEVENTPygame被啟用或者隱藏
KEYDOWN鍵盤按下
KEYUP鍵盤放開
MOUSEMOTION滑鼠移動
MOUSEBUTTONDOWN滑鼠按下
MOUSEBUTTONUP滑鼠放開
JOYAXISMOTION遊戲手柄(Joystick or pad) 移動
JOYBALLMOTION 遊戲球(Joy ball) 移動
JOYHATMOTION遊戲手柄(Joystick) 移動
JOYBUTTONDOWN遊戲手柄按下
JOYBUTTONUP遊戲手柄放開
VIDEORESIZEPygame視窗縮放
VIDEOEXPOSEPygame視窗部分公開(expose)
USEREVENT觸發一個使用者事件

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

事件處理方法

名稱說明
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 語句。如下所示:

import pygame

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_90…9
K_a...Kza…z
K_DELETE刪除鍵(delete)
K_KP0...K_KP90(小鍵盤)…9(小鍵盤)
K_F1...K_F15F1…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("./python.png")
# 獲取影象的位置
position = img.get_rect()
# 建立一個主視窗
screen = pygame.display.set_mode(size)
# 標題
pygame.display.set_caption("Python自學網")
# 建立遊戲主迴圈
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()

處理滑鼠事件

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

import pygame
from random import randint

# 初始化程式
pygame.init()
screen = pygame.display.set_mode((450, 400))
pygame.display.set_caption("Python自學網")
# 更新顯示
pygame.display.flip()
while True:
    # 等待事件發生
    event = pygame.event.wait()
    if event.type == pygame.QUIT:
        exit("成功退出")
    if event.type == pygame.MOUSEBUTTONDOWN:
        # pos 獲取滑鼠當前位置
        print('滑鼠按下', event.pos)
        mx, my = event.pos
        # 呼叫 pygame.draw 模組畫圓
        pygame.draw.circle(screen, (255, 255, 0), (mx, my), 50)
        # 處理完,更新顯示
        pygame.display.update()
    if event.type == pygame.MOUSEBUTTONUP:
        print('滑鼠彈起')
        pass
    if event.type == pygame.MOUSEMOTION:
        print('滑鼠移動')
        mx, my = event.pos
        # 隨機生成 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()

到此這篇關於Python之Pygame的Event事件模組的文章就介紹到這了,更多相關Pygame Event事件模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com