Pygame-游戏开发入门指南-五-

114 阅读14分钟

Pygame 游戏开发入门指南(五)

原文:Beginning Python games development with PyGame

协议:CC BY-NC-SA 4.0

十三、附录 A:游戏对象参考

本附录记录了游戏对象库中的一些最基本的类,这些类为创建 2D 和 3D 游戏提供了一个工具箱。有关游戏对象的最新信息,请参见https://github.com/PythonProgramming/Beginning-Game-Development-with-Python-and-Pygame

进口

游戏对象库由许多可以单独导入的子模块组成。一般来说,最好使用from <module> import <object>语法只导入您需要的类。例如,这一行导入了Color类:

from gameobjects.color import Color

有时,子模块中有一些您可能也想使用的辅助函数。在这种情况下,您可以使用from <module> import *将所有内容导入您的名称空间。例如,下面的行将导入gameobjects.vector3类中的所有内容:

from gameobjects.vector3 import *

贡献的

游戏对象库是一个开源项目,这意味着任何程序员都可以做出贡献。我们鼓励你提交你发现的任何错误修复,或者你认为可能对库有帮助的类。

游戏对象.颜色.颜色

颜色对象代表一种带有 alpha 值的颜色。组件存储在 0 到 1 的范围内,如 OpenGL 所使用的,但是您可以用rgba8属性或as_tuple方法转换成整数 RGBA 格式。颜色对象支持基本的数学运算符;乘、除、加、减。你也可以将颜色乘以或除以一个标量值(例如,一个整数或浮点数),但是加上或减去一个标量将会抛出一个TypeError异常。

构造器

gameobjects.color构造函数接受红色、绿色和蓝色分量以及一个可选的 alpha 分量,范围从 0 到 1。组件也可以由三个或四个值组成。如果颜色是在没有任何参数的情况下构造的,它将默认为黑色。

属性

可以检索组件并设置rgba属性(参见表 A-1 )。rgba8rgb8(只读)属性可用于将组件检索为一个 0 到 255 范围内的整数元组。

表 A-1 游戏对象.颜色属性

|

属性

|

目的

| | --- | --- | | r | 0 到 1 范围内的红色分量 | | g | 零到一范围内的绿色分量 | | b | 0 到 1 范围内的蓝色分量 | | a | 零到一范围内的 Alpha 分量 | | rgba8 号 | (红、绿、蓝、阿尔法)组件的元组,范围从 0 到 255(与 Pygame 的 draw 函数兼容) | | rgb8 | (红、绿、蓝)组件元组,范围为 0 到 255 |

方法

颜色对象支持表 A-2 中所示的方法。

表 A-2 。颜色方法

|

方法名称

|

说明

| | --- | --- | | copy() | 返回颜色的副本 | | as_tuple() | 将颜色的副本作为其组件的元组返回 | | as_tuple_rgb() | 将颜色的副本作为其红色、绿色和蓝色分量的元组返回 | | as_tuple_rgba() | 与as_tuple相同 | | as_html() | 以 HTML 格式返回包含颜色的字符串 | | saturate() | 强制所有分量在 0 到 1 的范围内 | | get_saturate() | 返回颜色的副本,其中所有组件都已饱和到范围 0–1 | | invert() | 反转颜色(将每个组件设置为 1 减去自身) | | mul_alpha() | 将红色、绿色和蓝色分量乘以 alpha 分量 |

类方法

gameobjects.color类包含许多类方法,这些方法提供了创建新颜色对象的替代方法(见表 A-3 )。

表 A-3 。颜色类方法

|

方法名称

|

说明

| | --- | --- | | black() | 返回表示黑色的颜色对象。 | | white() | 返回表示全白的颜色对象。 | | from_rgba8(r, g, b, a) | 从 0–255 范围内的颜色分量创建颜色对象。 | | from_html(col_str) | 从以 HTML 格式编码的颜色创建一个颜色对象。 | | gray (level) | 创建一个灰色对象;level是 0 到 1 范围内的一个值。 | | from_palette(color_name) | 从内部调色板创建命名的颜色,例如,red, ivory, aquamarine等。有关完整列表,请参见在线文档。 |

game objects . matrix 44 . matrix 44

Matrix44类存储一个代表 3D 变换的 4 x 4 矩阵。

构造器

如果没有给定参数,矩阵被初始化为单位矩阵。如果给定一个参数,它应该是一个由矩阵的 16 个分量组成的序列(例如,一个列表)。如果给定了四个参数,它们应该是最多四个值的四个序列。每行中缺少的值用单位矩阵中的值来填充(因此您可以使用Vector3或三个值的元组)。

属性

一个matrix44对象的属性(见表 A-4 )代表矩阵的行。您只能整体检索或设置这些属性的内容,也就是说,您不能单独设置行的各个部分。如果你需要访问矩阵中的单个值,使用matrix44对象的索引([])操作符。

表 A-4 gameobjects.matrix44.Matrix44 属性

|

属性

|

说明

| | --- | --- | | x_axis | 矩阵的 x 轴 | | right | x 轴的别名 | | y_axis | 矩阵的 y 轴 | | up | y 轴的别名 | | z_axis | 矩阵的 z 轴 | | forward | z 轴的别名 | | translate | 矩阵的翻译部分 |

方法

矩阵对象包含大量的方法来操作矩阵的组件,并使用它来变换点(参见表 A-5 )。

表 A-5 。Matrix44 属性

|

方法名称

|

说明

| | --- | --- | | to_opengl() | 返回与 OpenGL 兼容的矩阵组件列表。 | | set(row1, row2, row3, row4) | 设置矩阵的四行。 | | get_row(row_no) | 以四个值的元组形式检索矩阵的一行;row_no是行索引(0、1、2 或 3)。 | | fast_mul(rhs) | 将该矩阵乘以另一个矩阵。这比*=运算符稍快,但只能用于只包含旋转、缩放或平移的矩阵。 | | copy() | 返回此矩阵的副本。 | | components() | 返回 16 个矩阵分量的迭代器。 | | transposed_components() | 以转置顺序返回 16 个矩阵分量的迭代器。 | | rows() | 以四个值的元组的形式返回矩阵行的迭代器。 | | columns() | 以四值元组的形式返回矩阵列的迭代器。 | | get_row_vec3(row_no) | 将一行作为Vector3对象进行检索。 | | get_column(col_no) | 以四个值的元组形式检索列。 | | set_row(row_no, row) | 设置行的内容;row_no是要设置的行的索引,row 是要设置的最多四个值的序列。 | | set_column(col_no, col) | 设置列的内容;col_no是列的索引,row 是一个最多包含四个要设置的值的序列。 | | transform_vec3(v) | 用这个矩阵变换一个Vector3对象(v),并将结果作为另一个Vector3返回。 | | transform(v) | 转换向量并将结果作为元组返回。 | | transform_sequence(points) | 转换点序列,并将结果作为元组列表返回。 | | rotate(v) | 用矩阵变换一个点,但忽略矩阵的平移部分。 | | transpose() | 交换矩阵的行和列。 | | get_transpose() | 返回矩阵的转置副本。 | | get_inverse_rot_trans() | 返回只有旋转和平移的矩阵的逆矩阵。 | | get_inverse() | 返回此矩阵的逆矩阵。 | | invert() | 反转这个矩阵(原地)。 | | move(forward, right, up) | 基于平移的标题向平移添加偏移。这些参数都是可选的,应该是三个值的序列。 |

类方法

Matrix44类包含许多创建基本变换矩阵的类方法(见表 A-6 )。

表 A-6 。Matrix44 类方法

|

类方法名

|

说明

| | --- | --- | | from_iter(iterable) | 从 16 个值的 iterable(可以在 for 循环中工作的任何东西)创建一个矩阵。 | | clone(m) | 创建矩阵m的副本。 | | identity() | 创建一个单位矩阵。 | | scale(x, y, z) | 创建比例矩阵。如果省略 y 和 z 刻度,则返回 x 的统一刻度矩阵。 | | translation(x, y, z) | 创建到(x,y,z)的平移矩阵。 | | x_rotation(angle) | 围绕 x 轴创建一个弧度为angle的旋转矩阵。 | | y_rotation(angle) | 围绕 y 轴创建一个弧度为angle的旋转矩阵。 | | z_rotation(angle) | 围绕 z 轴创建一个弧度为angle的旋转矩阵。 | | rotation_about_axis(axis, angle) | 创建绕轴的旋转矩阵。axis参数可以是三个值的任意序列;angle参数应以弧度为单位。 | | xyz_rotation(x, y, z) | 创建一个矩阵,它具有围绕所有三个轴旋转的组合效果。 |

gameobjects.vector2.Vector2

类表示一个二维向量,可以用来存储 2D 游戏中的标题和位置。一个Vector2对象的组件可以通过xy属性访问,或者通过索引操作符([])访问。Vector2对象支持数学运算符。

构造器

Vector2对象的构造函数要么接受向量的 x 和 y 分量的两个值,要么接受两个值的序列。如果没有给定参数,vector 将默认为(0,0)。

属性

表格 A-7 列出了Vector2对象的属性。

表 A-7 向量 2 属性

|

属性

|

说明

| | --- | --- | | x | 向量的 x 分量。 | | y | 向量的 y 分量。 | | length | 向量的长度。也可以设置该属性来更改向量的长度。 |

方法

表 A-8 列出了Vector2对象的方法。

表 A-8 。Vector2 方法

|

方法名称

|

说明

| | --- | --- | | copy() | 返回这个向量的一个副本。 | | get_length() | 返回这个向量的长度。 | | get_magnitude() | 返回该向量的大小(与长度相同)。 | | normalize() | 规格化这个向量,使它的长度为 1。也返回向量。 | | get_normalized() | 返回向量的规范化副本。 | | get_distance:to() | 返回从这个向量到点的距离。 |

类方法

Vector2类有许多方法来构造新的Vector2对象(见表 A-9 )。

表 A-9 。Vector2 类方法

|

类方法名

|

说明

| | --- | --- | | from_iter(iterable) | 从可迭代的值中创建一个Vector2对象。 | | from_points(p1, p2) | 从两点创建一个Vector2对象。 |

gameobjects.vector3.Vector3

Vector3类表示一个 3D 向量,可以用来存储三维空间中的标题和位置。Vector3对象与Vector2对象非常相似,但是包含一个额外的属性z

构造器

Vector3对象的构造函数要么接受向量的 x、y 和 z 分量的三个值,要么接受三个值的序列。如果没有给定参数,vector 将默认为(0,0,0)。

属性

表格 A-10 列出了Vector3对象的属性。

表 A-10 向量 2 属性

|

属性

|

说明

| | --- | --- | | x | 向量的 x 分量。 | | y | 向量的 y 分量。 | | z | 向量的 z 分量。 | | length | 向量的长度。也可以设置该属性来更改向量的长度。 |

方法

表 A-11 列出了Vector3对象的方法。

表 A-11 。Vector3 方法

|

方法名称

|

说明

| | --- | --- | | set(x, y, z) | 将向量的分量设置为浮点值。 | | as_tuple() | 以三个值的元组形式返回向量。 | | get_length() | 检索向量的长度。 | | get_magnitude() | 检索向量的大小(与长度相同)。 | | set_length() | 设置向量的长度。 | | get_distance:to(p) | 检索从这个向量到点的距离。 | | normalize() | 归一化向量,使其长度为 1。也返回向量。 | | get_normalized() | 返回向量的规范化副本。 | | dot(other) | 返回这个向量与另一个向量的点积。 | | cross(other) | 返回这个向量与另一个向量的叉积。 |

类方法

表 A-12 列出了可用于创建新Vector3对象的类方法。

表 A-12 。Vector3 类方法

|

类方法名

|

说明

| | --- | --- | | from_points(p1, p2) | 在两点之间创建一个Vector3对象。 | | from_iter(iterable) | 从三个值的 iterable 创建一个Vector3对象。 |

十四、附录 B:打包你的游戏

如果你已经用 Pygame 写了一个游戏,你可能会想和别人分享你的杰作。分发游戏最简单的方法是将你的 Python 代码和数据打包成压缩的存档文件,比如 ZIP、TAR 或 GZIP,然后上传到你的网站或者通过电子邮件发送。这种方法的问题是,Python 和您使用的任何外部模块必须在您的游戏可以玩之前安装,这使得代码发行版只适合其他 Python 程序员。要将您的游戏分发给更广泛的非技术观众,您需要以一种熟悉的方式为您选择的平台打包您的游戏。

本附录介绍了如何将您的游戏打包成允许非技术用户安装和玩的格式。

创建 Windows 包

在 Windows 上安装游戏通常需要双击一个 EXE 文件,这将启动一个安装程序。安装程序通常是一个向导的形式,有几页显示许可协议,并询问用户从哪里复制游戏文件和安装什么图标。最后一页上的“完成”按钮开始复制文件和创建图标。

在 Windows 平台上为您的 Pygame 游戏创建用户友好的安装程序需要两个步骤:

  1. 将您的主 Python 文件转换成无需安装 Python 即可运行的可执行文件。
  2. 使用 installer builder 软件创建一个包含游戏文件的 EXE 文件。

创建安装程序使你的游戏可以被最广泛的观众访问,如果你的游戏是商业游戏,这是必不可少的。如果您的目标受众的技术水平足以解压缩 ZIP 文件并双击 EXE 文件,您可以跳过第二步。

使用 cx_Freeze

要把 Python 文件变成可执行文件,可以使用cx_Freeze,它本身就是一个 Python 模块。cx_Freeze不是 Python 标准库的一部分,但是可以在 cmd.exe/bash/terminal 中用下面的命令轻松安装:

pip install cx_Freeze

在为您的 Python 代码创建可执行文件之前,您需要编写setup.py,它包含关于您的项目的信息并启动cx_Freeze。让我们为第七章中的蚂蚁状态机清单创建一个setup.py ( 清单 B-1 )。

清单 B-1 。创建可执行的 Python 项目(setup.py)

import cx_Freeze

executables = [cx_Freeze.Executable("ants_game.py")]

cx_Freeze.setup(
    name="Ant Game",
    options={"build_exe": {"packages":["pygame"],
                           "include_files":["ant.png","leaf.png","spider.png",'gameobjects']}},
    executables = executables
    )

首先我们导入cx_Freeze,然后我们指定我们将要创建的可执行文件。接下来,我们用参数nameoptionsexecutables建立构建。在选项中,我们包括我们正在使用的标准包。我们构建的gameobjects库不能在包中工作,所以我们把它当作一个包含库,用include_files参数包含它。在这里,你可以放音乐、图像和任何其他你的程序应该附带的文件。然后定义可执行文件,我们已经完成了。确保你有我们的蚂蚁游戏的最终版本,名为ants_game.py,连同ant.pngleaf.pngspider.png都在与ants_game.py脚本以及我们现在正在编写的setup.py脚本相同的目录中。你还需要那里的gameobjects库。

这可能看起来很简单,但是将包冻结到可执行文件中会引起很大的麻烦!胆怯的人不应该去尝试。如需帮助打包有特定要求的东西,或了解更多关于模块如何工作的信息,请访问http://cx-freeze.readthedocs.org/en/latest/index.html

应该在 cmd.exe/bash/terminal 中使用以下命令运行setup.py脚本:

python setup.py build

如果您得到关于 python 不是可识别命令的错误,那么您可以:

C:/Python34/python setup.py build

这会搜索脚本使用的所有文件,并将其复制到名为build的文件夹中。在build里面是另一个包含一些机器信息的文件夹,然后在那里你会发现ants_game.exe文件,它启动了 Ant 状态机模拟,以及其他不需要先安装 Python 就能运行的必要文件。如果你压缩这个文件夹,你可以与任何人分享,不管他们是否安装了 Python 或者各种模块,他们可以运行游戏,但是为了专业的感觉,你还应该建立一个安装程序。

构建安装程序

对于稍微更专业的感觉,您也可以构建一个安装程序,它将为您的用户提供一个单独的安装程序。这样,他们不需要用一些文件提取器来处理解压缩,他们只需双击就可以安装你的应用。要做到这一点,除了在构建文件时,您需要做:

python setup.py bdist_msi

这将创建一个 dist 目录。dist 里面是安装程序。现在你可以把这个安装程序分发给你的朋友,然后他们就可以安装了。请记住,如果你有一个 32 位版本的 Windows,这使得游戏的 32 位安装程序。32 位或 64 位 Windows 可以安装并运行此程序。如果您使用的是 64 位版本的 windows,那么您的发行版将是 64 位的,不能在 32 位机器上运行。

为 Linux 创建软件包

为 Linux 创建包比为 Windows 创建包更容易,因为大多数发行版都默认安装了 Python,如果没有所需的 Python 版本,包管理器可以下载。要创建一个 Linux 包,使用 Python 标准库中的distutils模块,它可以生成源文件(tarballs)或 RPM 文件。包含游戏需求的描述也是一个好主意,以防 Linux 发行版不能提供它们。

有关distutils模块的更多信息,请参见https://docs.python.org/3.4/distutils/的在线文档。你也可以在 Linux 上使用cx_Freeze,通过安装它

pip install cx_Freeze

然后,您可以使用以下内容创建游戏的发行版:

cxfreeze ant_game.py

为 Mac 创建软件包

您也可以使用cx_Freeze创建 Mac 磁盘映像。你需要用安装cx_Freeze

pip install cx_Freeze

请参见 Windows 部分的清单 B-1 以创建setup.py文件,以及关于所需文件的信息。转换成磁盘映像的命令是

python setup.py bdist_dmg