详解Pygame 鼠标事件

  • Post category:Python

Pygame 鼠标事件是 Pygame 对于鼠标输入的响应事件。鼠标事件包括鼠标移动、鼠标点击、鼠标滚轮滚动等等。下面将会详细讲解 Pygame 鼠标事件的作用和使用方法。

鼠标事件作用

在 Pygame 中,通过鼠标事件可以响应鼠标的各种操作。通过监听鼠标事件,我们可以实现例如在点击某个按钮时触发某个事件、在鼠标移动到某个区域时触发某个事件等等功能。

鼠标事件类型

Pygame 中有多种鼠标事件类型,包括:

  • MOUSEMOTION 鼠标移动事件
  • MOUSEBUTTONDOWN 鼠标按钮按下事件
  • MOUSEBUTTONUP 鼠标按钮松开事件
  • MOUSEWHEEL 鼠标滚轮事件

鼠标事件使用方法

我们可以通过 Pygame 提供的 pygame.event.get() 方法获取所有的事件。因此,我们可以通过如下代码初始化 Pygame 并监听鼠标事件:

import pygame

# 初始化 Pygame
pygame.init()

# 设置窗口大小
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))

# 游戏循环
while True:
    # 检测事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:      # 关闭窗口事件
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:      # 按键按下事件
            if event.key == pygame.K_ESCAPE:    # esc 按下事件
                pygame.quit()
                sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:     # 鼠标按钮按下事件
            pos = pygame.mouse.get_pos()                # 获取鼠标位置
            print("鼠标按钮按下:", pos)
        elif event.type == pygame.MOUSEBUTTONUP:       # 鼠标按钮松开事件
            pos = pygame.mouse.get_pos()                # 获取鼠标位置
            print("鼠标按钮松开:", pos)

可以看到,我们通过 Pygame 提供的 pygame.mouse.get_pos() 方法获知鼠标当前的位置。同时,我们可以根据鼠标事件的 type 值,处理不同的鼠标事件。

下面我们将通过两个示例说明如何使用鼠标事件。

示例1:在鼠标点击时触发事件

在这个示例中,我们将创建一个按钮,并在鼠标点击该按钮时触发事件。

import pygame

# 初始化 Pygame
pygame.init()

# 设置窗口大小
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))

# 创建按钮
button = pygame.Rect(200, 200, 100, 50)
button_color = (255, 0, 0)

# 游戏循环
while True:
    # 检测事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:      # 关闭窗口事件
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:      # 按键按下事件
            if event.key == pygame.K_ESCAPE:    # esc 按下事件
                pygame.quit()
                sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:     # 鼠标按钮按下事件
            pos = pygame.mouse.get_pos()                # 获取鼠标位置
            if button.collidepoint(pos):         # 如果鼠标位置在按钮范围内
                print("按钮被按下了!")

    # 绘制按钮
    pygame.draw.rect(screen, button_color, button)

    # 更新窗口
    pygame.display.update()

在这个示例中,通过创建一个矩形来表示按钮,并通过 pygame.Rect.collidepoint() 方法判断鼠标是否在按钮范围内。如果鼠标在按钮范围内,则触发事件。

示例2:拖动图片

在这个示例中,我们将通过鼠标移动事件实现拖动一张图片的功能。我们首先加载一张图片,然后在鼠标移动时根据鼠标位置移动图片。

import pygame

# 初始化 Pygame
pygame.init()

# 设置窗口大小
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))

# 加载图片
img = pygame.image.load("img.png")
img_width = img.get_width()
img_height = img.get_height()
img_x = (screen_width - img_width) // 2
img_y = (screen_height - img_height) // 2

# 游戏循环
while True:
    # 检测事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:      # 关闭窗口事件
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:     # 鼠标按钮按下事件
            if event.button != 1:                    # 如果按下的不是左键
                continue
            pos = pygame.mouse.get_pos()                # 获取鼠标位置
            if img_x < pos[0] < img_x + img_width and img_y < pos[1] < img_y + img_height:
                # 如果鼠标位置在图片范围内,就将图片和鼠标位置的相对距离保存下来
                offset_x = pos[0] - img_x
                offset_y = pos[1] - img_y
        elif event.type == pygame.MOUSEMOTION:         # 鼠标移动事件
            if event.buttons[0]:                       # 如果鼠标左键被按下
                pos = pygame.mouse.get_pos()            # 获取鼠标位置
                img_x = pos[0] - offset_x
                img_y = pos[1] - offset_y

    # 绘制背景
    screen.fill((255, 255, 255))

    # 绘制图片
    screen.blit(img, (img_x, img_y))

    # 更新窗口
    pygame.display.update()

在这个示例中,我们通过 pygame.mouse.get_pos() 方法获取鼠标位置,并通过 pygame.MOUSEBUTTONDOWN 事件保存鼠标和图片位置的相对距离。在鼠标移动时,根据相对距离计算出图片的新位置。通过这个方法,我们实现了拖动图片的功能。

以上是 Pygame 鼠标事件的详细讲解。