📜  Pygame——事件处理(1)

📅  最后修改于: 2023-12-03 15:33:50.038000             🧑  作者: Mango

Pygame——事件处理

Pygame 是一个专门用于开发游戏的 Python 库。在 Pygame 中,事件处理非常重要,因为游戏中的用户输入、游戏流程等都需要通过事件来处理。

事件

在 Pygame 中,事件来源于用户输入、系统消息、定时器等。常用的事件类型有:

  • QUIT:用户关闭窗口;
  • KEYDOWN 和 KEYUP:键盘按下和松开事件;
  • MOUSEBUTTONDOWN 和 MOUSEBUTTONUP:鼠标按下和松开事件;
  • MOUSEMOTION:鼠标移动事件;
  • USEREVENT:自定义事件。
事件循环

事件循环是 Pygame 中非常重要的概念,它是一个无限循环,用于不断接收事件并处理。通常情况下,主循环的结构为:

import pygame

pygame.init()

# 创建窗口
screen = pygame.display.set_mode((640, 480))

# 设置窗口标题
pygame.display.set_caption('Pygame Demo')

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

    # 绘制游戏内容
    screen.fill((255, 255, 255))
    pygame.display.flip()

pygame.quit()

上述代码创建了一个 640x480 的新窗口并设置了标题为 Pygame Demo。在主循环中,不断地通过 pygame.event.get() 获取事件并逐一处理。在本例中,当 QUIT 事件触发时,将变量 running 置为 False 从而退出主循环。此外,当键盘按下 ESC 键时也会退出主循环。

在事件循环中,还可以通过 pygame.event.poll() 单次获取一个事件。在本例中,只需修改上述代码中的 for 循环:

# 处理事件
event = pygame.event.poll()
if event.type == pygame.QUIT:
    running = False
elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_ESCAPE:
        running = False
事件对象

在事件循环中,每次循环可通过 pygame.event.get() 或 pygame.event.poll() 获取一个事件,该事件为 pygame.event.Event 对象的实例。

在 Pygame 中,Event 对象包含以下属性:

  • type:事件的类型,如 KEYDOWN, MOUSEBUTTONDOWN 等;
  • dict:事件属性的字典。传递给事件的关键字参数存储在该字典中;
  • unicode:与 KEYDOWN 和 TEXTINPUT 事件相关;
  • key:与 KEYDOWN 和 KEYUP 事件相关;
  • mod:与 KEYDOWN 和 KEYUP 事件相关,用于表示按下修饰键时的情况;
  • pos:与 MOUSEBUTTONDOWN, MOUSEBUTTONUP 和 MOUSEMOTION 事件相关,表示鼠标位置;
  • button:与 MOUSEBUTTONDOWN 和 MOUSEBUTTONUP 事件相关;
  • rel:与 MOUSEMOTION 事件相关,表示相对移动距离。

在事件循环中,最常用的是判断事件类型,根据事件类型做出相应的操作。例如,检测到 KEYDOWN 事件时,可通过 event.key 判断用户按下了哪个键。

for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_RIGHT:
            # 用户按下了向右箭头键
        elif event.key == pygame.K_LEFT:
            # 用户按下了向左箭头键
自定义事件

在 Pygame 中,还可以自定义事件,即创建一个 Event 对象来表示用户自定义的事件。

我们可以通过 pygame.USEREVENT 创建一个自定义事件。创建事件后,可通过 pygame.time.set_timer() 函数来设置该事件的触发间隔时间。

例如,每隔 5 秒触发一次自定义事件:

# 创建自定义事件
MY_EVENT = pygame.USEREVENT + 1

# 设置自定义事件的触发间隔时间为 5 秒
pygame.time.set_timer(MY_EVENT, 5000)

while True:
    for event in pygame.event.get():
        if event.type == MY_EVENT:
            # 自定义事件触发
小结

在 Pygame 中,事件处理是非常重要的部分。在主循环中,通过 pygame.event.get() 或 pygame.event.poll() 获取事件,并根据事件类型做出相应的操作。同时,还可以自定义事件,并通过 pygame.time.set_timer() 函数设置事件的触发间隔时间。