详解Pygame 事件对象

  • Post category:Python

Pygame 是 Python 编程语言中的一个游戏开发库,它可以帮助我们方便地创建各种类型的游戏。在 Pygame 中,事件是使用最多的一个组件,主要用于与用户交互和控制游戏的行为。在本篇攻略中,我们将详细讲解 Pygame 中的事件对象以及它的作用和使用方法。

Pygame 事件对象

在 Pygame 中,事件是表示游戏行为和用户输入的对象。在 Pygame 中,事件是通过pygame.event模块创建的,它是在 pygame 库的初始化过程中自动创建的。每个事件都有一个类型和一组属性。其中,事件的类型是一个整数值,标识了事件的类别,例如:按键、鼠标、窗口等。而事件的属性则是用于描述事件的状态和数据,例如:按键的名称、鼠标的坐标、窗口的大小等。

Pygame 事件类型

在 Pygame 中,事件类型是一个整数值,可以使用pygame.event.EventType枚举类型定义。常用的事件类型有以下几种:

  • QUIT: 用户关闭窗口(点击 X 图标)时发出的事件。
  • KEYDOWN: 在按下按键时发出的事件。
  • KEYUP :在松开按键时发出的事件。
  • MOUSEBUTTONDOWN: 在鼠标点击时发出的事件。
  • MOUSEBUTTONUP: 在鼠标释放时发出的事件。
  • MOUSEMOTION: 在鼠标移动时发出的事件。

Pygame 事件属性

Pygame 的事件对象具有各种描述事件状态和数据的属性。以下是一些最常用的属性:

  • type:事件的类型,如 KEYDOWN 和 MOUSEBUTTONDOWN。
  • key:如果事件是按下或松开一个按键,此属性表示按键的名称。
  • pos:表示鼠标指针的位置,当鼠标移动或点击时使用。
  • button:如果事件是由鼠标点击或释放时,此属性表示按下或松开的鼠标按钮。
  • mod:如果事件是一个按键事件,则此属性包含按下的所有特殊键(如 shift、alt)。

Pygame 事件使用方法

在 Pygame 中,事件主要是通过两种方式使用:轮询模式和事件监听模式。

轮询模式

轮询模式是指在主循环中遍历所有事件,并对不同的事件类型做出不同的响应。下面是一个简单的示例:

import pygame

pygame.init()

screen = pygame.display.set_mode((400, 400))

done = False

while not done:
    for event in pygame.event.get(): # 获取所有的事件
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True

    screen.fill((255, 255, 255)) # 填充白色背景
    pygame.display.flip() # 更新屏幕

pygame.quit()

上面的示例中,我们使用pygame.event.get()方法来获取所有的事件。然后根据事件的类型和属性做出相应的处理,例如关闭窗口、退出游戏等。最后使用pygame.display.flip()方法来更新屏幕,让用户看到游戏的最新状态。

事件监听模式

事件监听模式是指注册事件,并在事件发生时响应,而不是在主循环中遍历所有事件。下面是一个简单的示例:

import pygame

pygame.init()

screen = pygame.display.set_mode((400, 400))

done = False

def handle_events(event): # 定义事件处理函数
    global done
    if event.type == pygame.QUIT:
        done = True
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_ESCAPE:
            done = True

pygame.event.set_blocked(None) # 阻止所有事件
pygame.event.set_allowed([pygame.QUIT, pygame.KEYDOWN]) # 允许特定事件

while not done:
    event = pygame.event.wait() # 等待事件发生
    handle_events(event) # 使用事件处理函数处理事件

    screen.fill((255, 255, 255)) # 填充白色背景
    pygame.display.flip() # 更新屏幕

pygame.quit()

上面的示例中,我们使用pygame.event.set_blocked(None)方法来阻止所有事件,然后使用pygame.event.set_allowed()方法来允许特定的事件。在主循环中,使用pygame.event.wait()方法等待事件发生,并将事件传递给事件处理函数进行处理。这种模式可以使游戏更具响应性。

示例说明

下面是两个示例,演示了 Pygame 事件对象的使用方法。

示例1:切换窗口背景色

在此示例中,我们将展示如何使用 Pygame 事件对象编写一个窗口背景色切换程序。用户可以使用鼠标单击屏幕,以更改窗口的背景色。

import pygame

pygame.init()

screen = pygame.display.set_mode((400, 400))

done = False
color = (255, 255, 255)

while not done:
    for event in pygame.event.get(): # 获取所有的事件
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.MOUSEBUTTONDOWN: # 在按下鼠标时更改颜色
            if color == (255, 255, 255):
                color = (0, 0, 0)
            else:
                color = (255, 255, 255)

    screen.fill(color) # 填充背景色
    pygame.display.flip() # 更新屏幕

pygame.quit()

在此示例中,我们注册了pygame.MOUSEBUTTONDOWN事件,并在按下鼠标时更改窗口的背景色。使用screen.fill()方法来填充窗口的背景色。

示例2:移动小球

在此示例中,我们将演示如何使用 Pygame 事件对象编写一个小球移动程序。用户可以使用箭头键来控制小球的移动。

import pygame

pygame.init()

screen = pygame.display.set_mode((400, 400))

done = False

x = 200
y = 200
vel = 5

while not done:
    for event in pygame.event.get(): # 获取所有的事件
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x -= vel
            if event.key == pygame.K_RIGHT:
                x += vel
            if event.key == pygame.K_UP:
                y -= vel
            if event.key == pygame.K_DOWN:
                y += vel

    screen.fill((255, 255, 255)) # 填充白色背景
    pygame.draw.circle(screen, (255, 0, 0), (x, y), 20) # 画一个红色圆

    pygame.display.flip() # 更新屏幕

pygame.quit()

在此示例中,我们注册了pygame.KEYDOWN事件,并在按下箭头键时移动小球的位置。使用pygame.draw.circle()绘制小球。