八、Pygame的Event事件模塊
事件(Event)是 Pygame 的重要模塊之一,它是構(gòu)建整個游戲程序的核心,比如常用的鼠標點擊、鍵盤敲擊、游戲窗口移動、調(diào)整窗口大小、觸發(fā)特定的情節(jié)、退出游戲等,這些都可以看做是“事件”。
8.1 事件類型
Pygame 定義了一個專門用來處理事件的結(jié)構(gòu),即事件隊列,該結(jié)構(gòu)遵循遵循隊列“先到先處理”的基本原則,通過事件隊列,我們可以有序的、逐一的處理用戶的操作(觸發(fā)事件)。下述表格列出了 Pygame 中常用的游戲事件:
名稱 | 說明 |
---|---|
QUIT |
用戶按下窗口的關(guān)閉按鈕 |
ATIVEEVENT |
Pygame被激活或者隱藏 |
KEYDOWN |
鍵盤按下 |
KEYUP |
鍵盤放開 |
MOUSEMOTION |
鼠標移動 |
MOUSEBUTTONDOWN |
鼠標按下 |
MOUSEBUTTONUP |
鼠標放開 |
JOYAXISMOTION |
游戲手柄(Joystick or pad) 移動 |
JOYBALLMOTION? |
游戲球(Joy ball) 移動 |
JOYHATMOTION |
游戲手柄(Joystick) 移動 |
JOYBUTTONDOWN |
游戲手柄按下 |
JOYBUTTONUP |
游戲手柄放開 |
VIDEORESIZE |
Pygame窗口縮放 |
VIDEOEXPOSE |
Pygame窗口部分公開(expose) |
USEREVENT |
觸發(fā)一個用戶事件 |
注意,當使用 Pygame 做游戲開發(fā)時,上述事件并非都會應(yīng)用的到,因此在學習的過程中,我們要懂得觸類旁通、舉一反三。
8.2 事件處理方法
名稱 | 說明 |
---|---|
pygame.event.get() |
從事件隊列中獲取一個事件,并從隊列中刪除該事件 |
pygame.event.wait()? |
阻塞直至事件發(fā)生才會繼續(xù)執(zhí)行,若沒有事件發(fā)生將一直處于阻塞狀態(tài) |
pygame.event.set_blocked()? |
控制哪些事件禁止進入隊列,如果參數(shù)值為None,則表示禁止所有事件進入 |
pygame.event.set_allowed()?? |
控制哪些事件允許進入隊列 |
pygame.event.pump()? |
調(diào)用該方法后,Pygame 會自動處理事件隊列 |
pygame.event.poll()? |
會根據(jù)實際情形返回一個真實的事件,或者一個None |
pygame.event.peek()?? |
檢測某類型事件是否在隊列中 |
pygame.event.clear() |
從隊列中清除所有的事件 |
pygame.event.get_blocked()? |
檢測某一類型的事件是否被禁止進入隊列 |
pygame.event.post()?? |
放置一個新的事件到隊列中 |
pygame.event.Event()?? |
創(chuàng)建一個用戶自定義的新事件 |
當我們使用 Pygame 處理事件時,邏輯一般都是相似的。首先是判斷事件的類型,然后根據(jù)不同的事件操作,執(zhí)行不同的游戲操作。因此這種情況非常適合使用 if … else 語句。如下所示:
import pygame
while True:
# 等待事件發(fā)生
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('鍵盤彈起')
8.3 處理鍵盤事件
鍵盤事件提供了一個 key 屬性,通過該屬性可以獲取鍵盤的按鍵。Pygame 將鍵盤上的字母鍵、數(shù)字鍵、組合鍵等按鍵以常量的方式進行了定義,下表列出了部分常用按鍵的常量:文章來源:http://www.zghlxwxcb.cn/news/detail-669900.html
名稱 | 說明 |
---|---|
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鍵 |
下面通過“圖片移動”示例來了解鍵盤事件的處理過程,如下所示:文章來源地址http://www.zghlxwxcb.cn/news/detail-669900.html
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)建一個主窗口
screen = pygame.display.set_mode(size)
# 標題
pygame.display.set_caption("Python自學網(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()
# 圖像移動 KEYDOWN 鍵盤按下事件
# 通過 key 屬性對應(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
# 移動圖像
position = position.move(site)
# 填充背景
screen.fill(bg)
# 放置圖片
screen.blit(img, position)
# 更新顯示界面
pygame.display.flip()
8.4 處理鼠標事件
Pygame 提供了三個鼠標事件,分別是鼠標移動(MOUSEMOTION)、鼠標按下(MOUSEBUTTONDOWN)、鼠標釋放(MOUSEBUTTONUP),不同事件類型對應(yīng)著不同的成員屬性。如下所示:
pygame.event.MOUSEMOTION鼠標移動事件
event.pos 相對于窗口左上角,鼠標的當前坐標值(x,y)
event.rel 鼠標相對運動距離(X,Y),相對于上次事件
event.buttons 鼠標按鈕初始狀態(tài)(0,0,0),分別對應(yīng)(左鍵,滑輪,右鍵),移動過程中點擊那個鍵,相應(yīng)位置變會為1
pygame.event.MOUSEBUTTONUP鼠標鍵釋放事件
event.pos 相對于窗口左上角,鼠標的當前坐標值(x,y)
event.button 鼠標釋放鍵編號(整數(shù))左鍵為1,按下滾動輪2、右鍵為3
pygame.event.MOUSEBUTTONDOWN 鼠標鍵按下事件
event.pos 相對于窗口左上角,鼠標的當前坐標值(x,y)
event.button 鼠標按下鍵編號(整數(shù)),左鍵為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自學網(wǎng)")
# 更新顯示
pygame.display.flip()
while True:
# 等待事件發(fā)生
event = pygame.event.wait()
if event.type == pygame.QUIT:
exit("成功退出")
if event.type == pygame.MOUSEBUTTONDOWN:
# pos 獲取鼠標當前位置
print('鼠標按下', 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('鼠標彈起')
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()
到了這里,關(guān)于【Python】【進階篇】八、Pygame的Event事件模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!