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. 键盘事件处理

  • KEYDOWNKEYUP 事件:
    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,可以实现丰富的用户交互逻辑。

posted @ 2025-04-12 14:13  天堂面包  阅读(84)  评论(0)    收藏  举报