Python之Pygame的Event事件模塊
Pygame的Event事件模塊
事件(Event)是 Pygame 的重要模塊之一,它是構(gòu)建整個(gè)游戲程序的核心,比如常用的鼠標(biāo)點(diǎn)擊、鍵盤(pán)敲擊、游戲窗口移動(dòng)、調(diào)整窗口大小、觸發(fā)特定的情節(jié)、退出游戲等,這些都可以看做是“事件”。
事件類型
Pygame 定義了一個(gè)專門(mén)用來(lái)處理事件的結(jié)構(gòu),即事件隊(duì)列,該結(jié)構(gòu)遵循遵循隊(duì)列“先到先處理”的基本原則,通過(guò)事件隊(duì)列,我們可以有序的、逐一的處理用戶的操作(觸發(fā)事件)。下述表格列出了 Pygame 中常用的游戲事件:
| 名稱 | 說(shuō)明 |
|---|---|
QUIT | 用戶按下窗口的關(guān)閉按鈕 |
ATIVEEVENT | Pygame被激活或者隱藏 |
KEYDOWN | 鍵盤(pán)按下 |
KEYUP | 鍵盤(pán)放開(kāi) |
MOUSEMOTION | 鼠標(biāo)移動(dòng) |
MOUSEBUTTONDOWN | 鼠標(biāo)按下 |
MOUSEBUTTONUP | 鼠標(biāo)放開(kāi) |
JOYAXISMOTION | 游戲手柄(Joystick or pad) 移動(dòng) |
JOYBALLMOTION | 游戲球(Joy ball) 移動(dòng) |
JOYHATMOTION | 游戲手柄(Joystick) 移動(dòng) |
JOYBUTTONDOWN | 游戲手柄按下 |
JOYBUTTONUP | 游戲手柄放開(kāi) |
VIDEORESIZE | Pygame窗口縮放 |
VIDEOEXPOSE | Pygame窗口部分公開(kāi)(expose) |
USEREVENT | 觸發(fā)一個(gè)用戶事件 |
注意,當(dāng)使用 Pygame 做游戲開(kāi)發(fā)時(shí),上述事件并非都會(huì)應(yīng)用的到,因此在學(xué)習(xí)的過(guò)程中,我們要懂得觸類旁通、舉一反三。
事件處理方法
| 名稱 | 說(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è)某類型事件是否在隊(duì)列中 |
pygame.event.clear() | 從隊(duì)列中清除所有的事件 |
pygame.event.get_blocked() | 檢測(cè)某一類型的事件是否被禁止進(jìn)入隊(duì)列 |
pygame.event.post() | 放置一個(gè)新的事件到隊(duì)列中 |
pygame.event.Event() | 創(chuàng)建一個(gè)用戶自定義的新事件 |
當(dāng)我們使用 Pygame 處理事件時(shí),邏輯一般都是相似的。首先是判斷事件的類型,然后根據(jù)不同的事件操作,執(zhí)行不同的游戲操作。因此這種情況非常適合使用 if … else 語(yǔ)句。如下所示:
import pygame
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)彈起')
處理鍵盤(pán)事件
鍵盤(pán)事件提供了一個(gè) key 屬性,通過(guò)該屬性可以獲取鍵盤(pán)的按鍵。Pygame 將鍵盤(pán)上的字母鍵、數(shù)字鍵、組合鍵等按鍵以常量的方式進(jìn)行了定義,下表列出了部分常用按鍵的常量:
| 名稱 | 說(shuō)明 |
|---|---|
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(小鍵盤(pán))…9(小鍵盤(pán)) |
K_F1...K_F15 | F1…F15 |
K_UP | 向上箭頭(up arrow) |
K_DOWN | 向下箭頭(down arrow) |
K_RIGHT | 向右箭頭(right arrow) |
K_LEFT | 向左箭頭(left arrow) |
KMOD_ALT | 同時(shí)按下Alt鍵 |
下面通過(guò)“圖片移動(dòng)”示例來(lái)了解鍵盤(pán)事件的處理過(guò)程,如下所示:
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()
# 創(chuàng)建一個(gè)主窗口
screen = pygame.display.set_mode(size)
# 標(biāo)題
pygame.display.set_caption("Python自學(xué)網(wǎng)")
# 創(chuàng)建游戲主循環(huán)
while True:
# 設(shè)置初始值
site = [0, 0]
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 圖像移動(dòng) KEYDOWN 鍵盤(pán)按下事件
# 通過(guò) key 屬性對(duì)應(yīng)按鍵
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
# 移動(dòng)圖像
position = position.move(site)
# 填充背景
screen.fill(bg)
# 放置圖片
screen.blit(img, position)
# 更新顯示界面
pygame.display.flip()
處理鼠標(biāo)事件
Pygame 提供了三個(gè)鼠標(biāo)事件,分別是鼠標(biāo)移動(dòng)(MOUSEMOTION)、鼠標(biāo)按下(MOUSEBUTTONDOWN)、鼠標(biāo)釋放(MOUSEBUTTONUP),不同事件類型對(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ì)為1pygame.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、右鍵為3pygame.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
import pygame
from random import randint
# 初始化程序
pygame.init()
screen = pygame.display.set_mode((450, 400))
pygame.display.set_caption("Python自學(xué)網(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()
到此這篇關(guān)于Python之Pygame的Event事件模塊的文章就介紹到這了,更多相關(guān)Pygame Event事件模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MAC平臺(tái)基于Python Appium環(huán)境搭建過(guò)程圖解
這篇文章主要介紹了MAC平臺(tái)基于Python Appium環(huán)境搭建過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
python爬蟲(chóng)基礎(chǔ)教程:requests庫(kù)(二)代碼實(shí)例
這篇文章主要介紹了python爬蟲(chóng)基礎(chǔ)教程:requests庫(kù)(二),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Python從零開(kāi)始訓(xùn)練AI模型的實(shí)用教程
本文介紹了如何使用Python從零開(kāi)始訓(xùn)練自己的AI模型,包括確定問(wèn)題和數(shù)據(jù)集、數(shù)據(jù)預(yù)處理、構(gòu)建模型、訓(xùn)練模型、評(píng)估和調(diào)優(yōu)模型以及部署和應(yīng)用模型等步驟2025-02-02
Python標(biāo)準(zhǔn)庫(kù)os常用函數(shù)和屬性詳解
os模塊是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)用于訪問(wèn)操作系統(tǒng)相關(guān)功能的模塊,os模塊提供了一種可移植的使用操作系統(tǒng)功能的方法,本文給大家介紹下?OS標(biāo)準(zhǔn)庫(kù)常用函數(shù)和屬性,感興趣的朋友跟隨小編一起看看吧2022-11-11

