Pygame 的事件系统介绍
Pygame 的事件系统 (pygame.event
) 是处理用户输入(如键盘、鼠标)和窗口事件(如关闭窗口)的核心模块。以下是详细功能介绍和常见用法:
1. 事件循环
Pygame 程序需要通过 事件循环 不断检测事件队列。基本框架:
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
running = True
while running:
for event in pygame.event.get(): # 获取所有待处理事件
if event.type == pygame.QUIT: # 处理关闭窗口事件
running = False
# 游戏逻辑和渲染代码
pygame.display.update()
pygame.quit()
2. 常用事件类型
通过 event.type
判断事件类型:
事件类型 | 触发条件 |
---|---|
pygame.QUIT |
用户点击窗口关闭按钮 |
pygame.KEYDOWN |
键盘按键被按下 |
pygame.KEYUP |
键盘按键被释放 |
pygame.MOUSEBUTTONDOWN |
鼠标按键被按下 |
pygame.MOUSEBUTTONUP |
鼠标按键被释放 |
pygame.MOUSEMOTION |
鼠标移动 |
pygame.VIDEORESIZE |
窗口大小改变(需启用pygame.RESIZABLE ) |
3. 键盘事件处理
KEYDOWN
和KEYUP
事件:if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: # 按下空格键 print("Space pressed!") elif event.key == pygame.K_ESCAPE: # 按下ESC键 running = False
- 常用键值常量:
pygame.K_a
(A键)、pygame.K_UP
(方向键上)等。
- 常用键值常量:
4. 鼠标事件处理
-
点击事件:
if event.type == pygame.MOUSEBUTTONDOWN: print("Mouse clicked at:", event.pos) # 获取点击坐标(x, y) if event.button == 1: # 左键=1,右键=3,中键=2 print("Left click")
-
移动事件:
if event.type == pygame.MOUSEMOTION: print("Mouse position:", event.pos) print("Mouse relative movement:", event.rel) # 相对上一帧的偏移量
5. 自定义事件
Pygame 允许创建自定义事件(通过唯一的事件ID):
MY_EVENT = pygame.USEREVENT + 1 # USEREVENT是保留的起始ID
# 触发自定义事件(例如通过定时器)
pygame.time.set_timer(MY_EVENT, 1000) # 每1000ms触发一次
# 处理自定义事件
if event.type == MY_EVENT:
print("Custom event triggered!")
6. 其他常用方法
-
过滤事件:限制处理的事件类型(优化性能)
pygame.event.set_allowed([pygame.KEYDOWN, pygame.QUIT]) # 只允许处理按键和退出事件 pygame.event.set_blocked(pygame.MOUSEMOTION) # 屏蔽鼠标移动事件
-
清空事件队列:
pygame.event.clear() # 清除所有未处理事件
-
等待事件(适用于不需要实时更新的程序):
event = pygame.event.wait() # 阻塞直到有事件发生
7. 完整示例
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
elif event.key == pygame.K_w:
print("W key pressed")
elif event.type == pygame.MOUSEBUTTONDOWN:
print(f"Clicked at: {event.pos}")
screen.fill((0, 0, 0)) # 清屏
pygame.display.update()
pygame.quit()
注意事项
- 必须处理
pygame.QUIT
事件:否则用户无法正常关闭窗口。 - 避免阻塞事件队列:长时间不处理事件会导致程序卡顿。
- 事件类型冲突:自定义事件ID需从
pygame.USEREVENT
开始递增。
通过灵活使用 pygame.event
,可以实现丰富的用户交互逻辑。