Pygame事件处理详解:键盘与鼠标交互实现

Miles
Miles
发布时间:2026-10-14| 3人浏览过
原创

本文深入解析Pygame中的事件处理机制,重点讲解键盘与鼠标交互的实现方法。通过对比pygame.event.get()与wait()的区别,详细阐述键盘事件KEYDOWN的处理逻辑及get_pressed()函数的应用。同时,系统介绍鼠标相关函数如get_pos、get_rel等,并结合坦克移动与图形绘制示例,提供完整的代码实现与运行效果说明。

所谓事件,是指程序中发生的各种操作行为。例如用户按下键盘上的某个键,或者对鼠标进行单击、移动等操作,游戏程序都需要对此做出相应反应。在《Pygame图像/图形绘制》的示例中,程序会持续运行,直到用户关闭窗口并触发一个QUIT事件。Pygame能够接收用户的多种操作(如按键、移动鼠标等)并生成相应的事件。由于事件随时可能发生且数量可能很大,Pygame采取的策略是将一系列事件存入队列,然后逐个进行处理。

在上节的示例中,使用了pygame.event.get()来遍历处理所有事件。如果改用pygame.event.wait(),Pygame会暂停程序直到发生一个事件才继续执行,这种方式在游戏开发中通常不太实用,因为游戏通常需要动态持续运行。以下是Pygame中常用事件的分类说明:

事件 产生途径 参数
QUIT 用户按下“关闭”按钮 None
ACTIVEEVENT pygame 被激活或者隐藏 gain 、state
KEYDOWN 键盘被按下 unicode 、key 、mod
KEYUP 键盘被放开 key 、mod
MOUSEMOTION 鼠标移动 pos 、rel 、buttons
MOUSEBUTTONDOWN 鼠标被按下 pos 、button
MOUSEBUTTONUP 鼠标被放开 pos 、button

1. Pygame键盘事件的处理方法

通常使用pyagme.event.get()来获取所有发生的事件。若检测到event.type == KEYDOWN,则表明当前为键盘事件,此时需进一步判断按键的event.key类型(例如K_a、K_b、K_LEFT等格式)。此外,用户也可以使用pygame.key.get_pressed()来获取所有当前被按下的键值状态,以此判断特定键是否处于按下状态。


keys_pressed = pygame.key.get_pressed()
if keys_pressed[K_SPACE]:
  # 空格键被按下
  fire()      # 发射子弹

在key模块中提供了多个实用函数,具体如下:

  • key.get_focused():返回当前Pygame窗口是否处于激活状态。
  • key.get_pressed():获取所有当前被按下的键值列表。
  • key.get_mods():返回当前按下的组合键状态(如Alt、Ctrl、Shift)。
  • key.set_mods():用于模拟按下组合键的效果(涉及KMOD_ALT、KMOD_CTRL、KMOD_SHIFT等常量)。

下面通过一个由用户控制坦克移动的游戏案例来演示Pygame的应用。在上一节例子的基础上,增加通过方向键控制坦克移动的功能,并为游戏添加背景图片。具体代码如下:


import pygame
def tank_play():
  pygame,inite()
  tank_image = pygame.image.load("../images/tank.png")
  tank_rect = tank_image.get_rect()
  back_image = pygame.iamge.load("../images/background2.jpg")
  back_rect = back_image.get_rect()
  screen = pygame.display.set_mode(back_rect.size)
  pygame.display.set_caption("用户方向键控制移动的坦克")
  offset = 2   # 偏移量
  fps_clock = pygame.time.Clock()
  while True:
    fps_clock.tick(60)
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
        pygame.quit()
        exit()
    keys_pressed = pygame.key.get_presssed()
    if keys_pressed[pygame.K_RIGHT]:
      tank_rect.x += offset
    if keys_pressed[pygame.K_LEFT]:
      tank_rect.x -= offset
    if keys_pressed[oygame.K_UP]:
      tank_rect.y -= offset
    if keys_pressed[pygame.K_DOWN]:
      tank_rect.y += offset
    tank_rect.clamp_ip(back_rect)
    screen.blit(back_image, back_rect)
    screen.blit(tank_image, tank_rect)
    pygame.display.update()
      
if __name__ == '__main--':
  tank_play()

当用户按下方向键时,坦克会按指定方向移动;当释放方向键时,坦克停止移动。运行效果如下所示:

2. Pygame鼠标事件的处理方法

Pygame中处理鼠标事件的常用函数如下:

  • pygame.mouse.get_pressed():返回按键的按下状态,结果为一个元组,分别对应左键、中键和右键的状态,若按键被按下则返回True。
  • pygame.mouse.get_rel():返回鼠标的相对偏移量,即包含x方向偏移量和y方向偏移量的元组。
  • pygame.mouse.get_pos():返回当前鼠标在窗口中的坐标位置(x, y)。

例如:x, y = pygame.mouse.get_pos()可用于获取当前鼠标的位置坐标。

  • pygame.mouse.set_pos():用于设置鼠标在窗口中的位置。
  • pygame.mouse.set_visible():设置鼠标光标是否可见。
  • pygame.mouse.get_focused():如果鼠标位于Pygame窗口内且有效,则返回True。
  • pygame.mouse.set_cursor():用于设置鼠标的默认光标样式。
  • pygame.mouse.get_cursor():返回当前鼠标的光标样式。

以下是一个演示鼠标事件处理的程序代码:


from math import pi
from random import randint
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
points = []
while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      exit()
  	if event.type == pygame.KEYDOWN:
      # 按任意键可清屏,并把点恢复到原始状态
      points = []
      srceen.fill((255, 255, 255))   # 用白色填充窗口背景
    if event.type == pygame.MOUSEBUTTONDOWN:	# 鼠标按下
      screen.fill((255, 255, 255))
      # 画随机矩形
      rc = (255, 0, 0)	# 红色
      rp = (randint(0, 639), randint(0, 479))
      rs = (639 - randint(rp[0], 639), 479 - randint(rp[1], 479))
      pygame.draw.rect(screen, rc, pygame.Rect(rp, rs))
      # 画随机圆形
      rc = (0, 255, 0)	# 绿色
      rp = (randint(0, 639), randint(0, 479))
      rr = randint(1, 200)
      pygame.draw.circle(screen, rc, rp, rr)
      # 获取当前鼠标单击位置
      x, y = pygame.mouse.get_pos()
      points.append((x, y))
      # 根据单击位置画弧线
      angle = (x / 639) * pi * 2
      pygame.draw.arc(screen, (0, 0, 0), (0, 0, 639, 479), 0, angle, 3)
      # 根据单击位置画椭圆
      pygame.draw.ellipse(screen, (0, 255, 0), (0, 0, x, y))
      # 从左上和右下画两根连线到单击位置
      pygame.draw.line(screen, (0, 0, 255), (0, 0), (x, y))
      pygame.draw.line(screen, (255, 0, 0), (640, 480), (x, y))
      # 画单击轨迹图
      if len(points) > 1:
        pygame.draw.lines(screen, (155, 155, 0), points, False, 2)
      # 把鼠标单击的每个点画明显点
      for p in points:
        pygame.draw.circle(screen, (155, 155, 155), p, 3)
	pygame.display.update()

运行该程序后,在窗口上单击鼠标即可生成图形,按下键盘上的任意键可清屏并重新开始。运行效果如下:

至此,关于Pygame实现键盘和鼠标事件处理的文章介绍完毕。如需了解更多相关Pygame键盘和鼠标事件的内容,请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。