Python Pygame (游戏开发库)

2025年3月8日 | 阅读 16 分钟
Python Pygame Tutorial

Python 是最流行的编程语言,或者说它是下一代编程语言也不为过。在计算机科学的每个新兴领域,Python 都积极地展现着它的存在。Python 拥有各种领域的庞大库,例如机器学习(Numpy、Pandas、Matplotlib)、人工智能(Pytorch、TensorFlow)和游戏开发(Pygame、Pyglet)

在本教程中,我们将学习如何使用Pygame(Python 库)进行游戏开发。

Pygame

  • Pygame 是一个跨平台的 Python 模块集,用于创建视频游戏。
  • 它包含计算机图形学和声音库,旨在与 Python 编程语言一起使用。
  • Pygame 最初由Pete Shinners编写,用以取代 PySDL。
  • Pygame 适合创建可以封装为独立可执行文件的客户端应用程序。

Pygame 的先决条件

在学习 Pygame 之前,我们需要了解我们想要开发什么样的游戏。

  • 学习 Pygame 需要具备 Python 的基本知识。

Pygame 安装

在 Windows 上安装 Pygame

在安装 Pygame 之前,系统中应已安装 Python,建议使用 3.6.1 或更高版本,因为它对初学者更友好,而且运行速度更快。安装 Pygame 主要有两种方法,如下所示:

1. 通过 pip 安装:通过 pip 工具安装 Pygame 是个好方法(Python 使用它来安装包)。命令如下:

2. 通过 IDE 安装:第二种方法是通过 IDE 进行安装,这里我们使用 Pycharm IDE。在 pycharm 中安装 pygame 非常简单。可以通过运行上面的命令在终端中安装,或者使用以下步骤:

  • 打开文件选项卡,然后点击设置选项。
Pygame Installation
  • 选择项目解释器,然后点击+图标。
Pygame Installation
  • 将显示搜索框。搜索 pygame,然后点击安装包按钮。
Pygame Installation

要检查 pygame 是否已正确安装,请在 IDLE 解释器中,键入以下命令并按 Enter 键:

如果命令成功运行且没有出现任何错误,则表示我们已成功安装 Pygame 并找到了适合 pygame 编程的 IDLE 版本。

Pygame Installation

在 Mac 上安装 Pygame

以下是在 Mac 上安装 Pygame 的步骤:

  • 访问 pygame 的官方网站pygame.org,它会显示如下窗口,下载pygame-1.9.1release-python.org-32bit-py2.7-macosx10.3.dmg:
Pygame Installation

注意:如果您使用的是不同版本的 Python,请下载最后一个链接。

  • 双击下载的文件并解压。现在双击出现的解压后的mpkg文件以运行安装程序。按照说明安装 pygame。
  • 启动终端(Cmd+Space,然后输入'terminal')。在终端中,键入'python2.7'并按 Enter 键。
  • Python 应该会启动,显示版本为 2.7.2(2.7.1 也可以),并出现提示符。在 Python 提示符下,键入'import pygame'。如果没有出现任何错误,则一切正常。

简单的 Pygame 示例

这是 Pygame 的一个简单程序,可以提供语法基本概念。

输出

成功执行后,它将显示如下输出窗口:

Pygame Installation

让我们逐行理解上面程序的语法:

import pygame - 这提供了对 pygame 框架的访问,并导入 pygame 的所有函数。

pygame.init() - 用于初始化 pygame 的所有必需模块。

pygame.display.set_mode((width, height)) - 用于显示所需大小的窗口。返回值是一个 Surface 对象,我们将在其中执行图形操作。

pygame.event.get()- 用于清空事件队列。如果我们不调用此函数,窗口消息将开始堆积,并且操作系统会认为游戏变得无响应。

pygame.QUIT - 用于在单击窗口角落的关闭按钮时终止事件。

pygame.display.flip() - Pygame 是双缓冲的,所以这会切换缓冲区。调用此函数以使您对游戏屏幕进行的任何更新都可见,这是至关重要的。

Pygame Surface

Pygame Surface 用于显示任何图像。Surface 具有预定义的解析度和像素格式。Surface 颜色默认为黑色。其大小通过传递size参数来定义。

Surface 可以具有许多额外的属性,例如alpha 平面、颜色键、源矩形剪辑等。blit 例程将尝试使用硬件加速,如果可能的话;否则,它们将使用高度增强的软件 blitting 方法。

Pygame Clock

在 Pygame 中,时间以毫秒(1/1000 秒)表示。Pygame Clock 用于跟踪时间。时间对于创建动画、播放声音或响应任何事件至关重要。通常,我们不按秒计算时间。我们按毫秒计算。Clock 还提供各种函数来帮助控制游戏的帧率。以下是一些函数:

tick()

此函数用于更新时钟。语法如下:

此方法应每帧调用一次。它将计算自上次调用以来经过了多少毫秒。framerate参数是可选的,如果将其作为参数传递,则该函数将延迟以使游戏运行速度低于给定的每秒帧数。

tick_busy_loop()

tick_busy_loop() 与 tick() 相同。通过每帧调用Clock.tick_busy_loop(20)一次,程序永远不会超过每秒 20 帧。语法如下:

get_time()

get_time() 用于获取上一个 tick。在 Clock.tick() 的最后两次调用之间经过的毫秒数。

Pygame Blit

Pygame blit 是将游戏对象渲染到 Surface 的过程,这个过程称为blitting。当我们创建游戏对象时,我们需要渲染它。如果我们不渲染游戏对象而运行程序,它将输出一个黑色窗口。

Blitting 是任何游戏中较慢的操作之一,因此我们需要小心,不要在每一帧中过度 blit 到屏幕上。用于 blitting 的主要函数是 blit(),如下所示:

blit()

此函数用于将一个图像绘制到另一个图像上。绘制可以放在 dest 参数处。dest 参数可以是表示源左上角的坐标对。

Pygame 添加图像

要在窗口上添加图像,首先我们需要通过调用 Surface 构造函数并传递宽度和高度元组来实例化一个空白 Surface。

上面一行创建了一个 100*100 像素的空白 24 位 RGB 图像,默认颜色为黑色。

要实现 Surface 的透明初始化,请传递 SRCALPHA 参数。

考虑以下在 Surface 上显示图像的示例:

输出

Pygame Adding Image

Pygame Rect

Rect 用于在 Pygame 中绘制矩形。Pygame 使用 Rect 对象来存储和操作矩形区域。Rect 可以由 left、top、width 和 height 值组合而成。它也可以由已经是 Rect 的 Python 对象或具有名为 "rect" 的属性的对象创建。

rect() 函数用于执行矩形的位置或大小的更改。它返回具有受影响更改的 Rect 的新副本。原始矩形不会发生任何修改。

Rect 对象具有各种虚拟属性,可用于移动和对齐 Rect:

可以通过分配大小、宽度或高度来更改矩形的尺寸。所有其他赋值都会移动矩形而不调整其大小。

如果 Rect 的宽度或高度为非零值,则对于非零测试,它将返回 True。某些方法返回大小为 0 的 Rect 来表示无效矩形。

让我们使用 Rect 在 pygame 窗口上创建一个矩形:

执行上述代码后,它将在 pygame 窗口上显示一个矩形。

Pygame Rect

Pygame Keydown

Pygame KEYDOWN 和 KEYUP 检测按键物理按下和释放的事件。KEYDOWN 检测按键,KEYUP 检测按键释放。这两个事件(按键按下和按键释放)都有两个属性,如下所示:

  • key: key 是一个整数 ID,代表键盘上的每个键。
  • mod: 这是一个位掩码,表示事件发生时按下的所有修饰键。

考虑以下按键按下和释放的示例:

输出

Pygame Keydown

让我们看另一个例子:

在上面的代码中,矩形将被显示在 pygame 窗口上。

Pygame Keydown

当我们按下向下键时,矩形会向下移动。输出如下:

Pygame Keydown

Pygame Draw

Pygame 提供了几何函数来在 Surface 上绘制简单的形状。这些函数可用于渲染到任何格式的 Surface。大多数函数都接受一个 width 参数来指定形状边缘的厚度。如果 width 传递为 0,则形状将是实心的(填充的)。

所有绘图函数都接受 color 参数,该参数可以是以下格式之一:

  • pygame.Color 对象
  • (RGB) 三元组(元组/列表)
  • (RGBA) 四元组(元组/列表)
  • 一个整数值,该值已映射到 Surface 的像素格式

绘制矩形

以下函数用于在给定 Surface 上绘制矩形:

参数

  • surface - 要绘制的屏幕。
  • color- 此参数用于为给定形状着色。如果使用元组,则 alpha 值是可选的。
  • rect(Rect)- 绘制矩形、位置和尺寸。
  • width(int)- 这是可选的,用于指定线条粗细或指示矩形已填充。

绘制多边形

以下函数用于在给定 Surface 上绘制多边形:

  • pygame.draw.polygon(surface,color,points)
  • pygame.draw.polygon(surface, color, points, width=0)

参数

  • surface - 要绘制的屏幕。
  • color- 此参数用于为给定形状着色。如果使用元组,则 alpha 值是可选的。
  • points(tuple(coordinate) or list(coordinate)): 一个由 3 个或更多 (x,y) 坐标组成的序列,构成多边形的顶点。序列中的每个坐标都必须是元组/列表。

注意:- 如果 len(points) < 3 或 points 不是序列或 points 不包含数字对,则会引发 ValueError。

绘制椭圆

以下函数用于在给定 Surface 上绘制椭圆:

参数

  • surface - 要绘制的屏幕。
  • color- 此参数用于为给定形状着色。如果使用元组,则 alpha 值是可选的。
  • rect(Rect)- 绘制矩形、位置和尺寸。

绘制直线

此方法用于在给定 Surface 上绘制直线。没有端点。

参数

  • surface - 要绘制的屏幕。
  • color- 此参数用于为给定形状着色。如果使用元组,则 alpha 值是可选的。
  • start_pos- 直线的起始位置 (x,y)
  • end_pos- 直线的结束位置

绘制圆形

以下函数用于在给定 Surface 上绘制圆形:

  • circle(surface, color, center, radius)
  • circle(surface, color, center, radius, width=0)

参数

  • surface - 要绘制的屏幕。
  • color- 此参数用于为给定形状着色。如果使用元组,则 alpha 值是可选的。
  • center - 圆的中心点,表示为两个整数/浮点数的序列,例如 (x,y)
  • radius(int or float)- 圆的半径,从 center 参数测量,如果半径为零,则它只绘制中心像素。

绘制椭圆弧

以下函数用于在给定 Surface 上绘制椭圆弧:

参数

  • surface - 要绘制的屏幕。
  • color- 此参数用于为给定形状着色。如果使用元组,则 alpha 值是可选的。
  • rect(Rect)- 绘制矩形、位置和尺寸。
  • start_angle- 弧的起始角度(以弧度为单位)。
  • stop_angle- 弧的结束角度(以弧度为单位)。

start_angle 和 stop_angle 参数有三个条件:

  1. 如果 start_angle < stop_angle,则弧将从 start_angle 以逆时针方向绘制到 end_angle。
  2. 如果 start_angle>stop_angle,则 tau (tau=2*pi) 将被加到 stop angle。
  3. 如果 start_angle==stop_angle,则不绘制任何内容。

让我们看一个例子

输出

Pygame Draw

Pygame 文本和字体

Pygame 还提供了渲染字体和文本的功能。我们可以使用pygame.font.SysFont()函数从系统中加载字体。Pygame 自带内置的默认字体,可以通过传递字体名称或 None 来访问。有许多函数有助于处理字体。

字体对象使用pygame.font.Font()创建。实际的字体对象完成了大多数与字体相关的工作。字体对象通常用于将文本渲染到新的 Surface 对象。一些重要的字体函数如下:

render()

此函数用于在新 Surface 上绘制文本。Pygame 没有在现有 Surface 上绘制文本的功能。它创建一个新的 Surface 并将其渲染为指定的文本。语法如下:

size()

此函数用于确定渲染文本所需的空格或定位。它还可以用于自动换行和其他布局效果。语法如下:

set_bold()

此函数用于粗体渲染文本。语法如下:

让我们看下面的例子

输出

Pygame Text and Font

注意 - 必须记住,某些字体必须安装在用户的计算机上。如果您不知道字体是否已安装,pygame 有以下函数可以枚举计算机上所有可用的字体:

还有另一个函数可以实例化默认系统字体:

使用以上任何函数,我们都可以处理游戏中的精美字体。

Pygame Sprite 和碰撞检测

pygame sprite 是一个二维图像,它是大型图形场景的一部分。通常,sprite 将是场景中的某个对象。

使用 sprite 的最大优势之一是能够将它们组合使用。如果精灵在组中,我们可以用一个命令轻松地移动和绘制所有精灵。

Sprite 模块包含用于游戏内的各种简单类。在使用 pygame 时,可以选择使用 Sprite 类和不同的组类。

Pygame 提供精灵和精灵组,用于碰撞检测。碰撞检测是屏幕上的两个对象相互碰撞的过程。例如,如果玩家被敌人的子弹击中,它可能会失去一条命,或者程序需要知道玩家何时碰到硬币,以便它们被自动拾取。

让我们看下面的例子

输出

Pygame Sprite and Collision detection

按下箭头键后,一个矩形将与另一个矩形碰撞,输出如下:

Pygame Sprite and Collision detection

Pyglet

Python 还提供了一个名为 pyglet 的游戏库,它是一个跨平台的窗口和多媒体库,用于 Python。它用于开发游戏和其他视觉丰富的应用程序。它支持用户界面事件处理、窗口管理、OpenGL 图形、加载图像和视频以及播放声音和音乐。

Pyglet 的一些特点如下:

  • 无外部安装要求或依赖项。
  • 支持多个窗口和多显示器。
  • 它可以以任何格式加载图像、声音、音乐和视频。
  • Pyglet 在 BSD 开源许可证下提供。
  • 它同时支持 Python 2 和 3。

Pyglet 的安装很简单;可以通过键入以下命令来安装:

请看以下示例。

输出

Pyglet

Pygame 与 Pyglet 的比较

PygletPygame
3D 支持
由于 pyglet 与 OpenGL 紧密集成。它允许支持 3D 绘图。
简单的 Python 语法
Pygame 使用 Python 作为其脚本语言。Python 被广泛认为是即使对于初学者来说也最容易掌握的语言之一。
跨平台
它可以与 Windows、Linux 和 OS X 配合使用。
使用 API
API 非常直接。
纯 Python 编写
可以使用其他 Python 解释器进行编译。
最佳画布系统
Pygame 提供了一个绘图系统,允许用户创建和绘制无限数量的画布。
不那么受欢迎
Pyglet 不太受欢迎,因为它的社区支持较少。
更受欢迎
Pygame 比 pyglet 更受欢迎。

在本教程中,我们通过在 Python 3 编程环境中安装开源模块 pygame,讨论了简单的游戏开发编程方法。