持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情
探索向量
我们使用两个值来生成对角线运动:位置的 x 分量的速度和 y 分量的另一个速度。这两个值的组合形式就是所谓的向量。矢量是游戏开发人员借用的东西
数学,它们被用于许多领域,在2D和3D游戏中。
向量与点相似,因为它们都具有 x 和 y 的值(在 2D 中),但它们用于不同的目的。坐标 (10,20) 处的点将始终是屏幕上的同一点,但向量 (10, 20) 表示从当前位置向 x 坐标添加 10,向 y 坐标添加 20。因此,您可以将点视为来自原点(0,0)的向量。
创建矢量
您可以通过从第二个点中减去第一个点中的值来计算任意两个点的矢量。让我们用一个虚构游戏的例子来演示。玩家角色 - 来自未来的控制论增强的士兵Alpha - 必须用狙击步枪摧毁Beta级哨兵机器人。阿尔法躲在座标A(10,20)的灌木丛后面,瞄准座B(30,35)的贝塔。为了计算到目标的向量AB,Alpha必须从A中减去B的分量。所以向量AB是(30,35)-(10,20),即(20,15)。这告诉我们,要从A到B,我们必须在x方向上使用20个单位,在y方向上需要15个单位(参见图5-1)。游戏需要这些信息来制作投射武器的动画或在两点之间绘制激光束。
存储矢量
Python中没有内置的矢量类型,但对于所有数字,最常用的模块是NumPy。NumPy是一个C优化模块,用于处理Python中的各种数值运算。NumPy的网站是:www.numpy.org/.To 安装NumPy,您将需要经历与安装PyGame时最有可能相同的操作。最简单的方法是在您的命令行/终端中使用pip:
pip install numpy
虽然我们可以使用NumPy,但我相信使用NumPy可以混淆幕后实际发生的事情,特别是如果这是你第一次使用矢量和矩阵进行游戏开发。在完成这些示例的过程中,我将介绍如何自己对向量和矩阵运算进行编程,并为您指出模仿相同运算的NumPy功能的方向。
class Vector2:
def __init__(self,x=0,y=0):
self.x=x
self.y=y
def __str__(self):
return "(%s,%s)"%(self.x,self.y)
要定义向量,我们现在可以使用 Vector2 对象。例如,调用my_vector = Vector2(10, 20) 会生成一个名为 my_vector 的 Vector2 对象。我们可以将向量的分量分别称为my_vector.x 和 my_vector.y。
我们应该添加到 Vector2 类中的第一件事是从两个点创建向量的方法,因为这是创建向量的最常见方法(参见清单 5-6)
前面的操作 (P2[0] - P1[0], P2[1] - P1[1]),可以通过导入 NumPy 模块然后执行(numpy.array(P1) - numpy·数组 (P1) )来实现。清单 5-7 显示了如何使用我们的类在两点之间创建一个向量。
执行此示例将生成以下输出:
(20.0,15.0)
矢量幅度
从 A 到 B 的矢量大小是这两点之间的距离。
继续网络士兵主题,Alpha的燃料数量有限,需要计算从A到B的距离,以了解他是否可以到达B。我们已经计算出向量 AB 为 (20, 15)。这个幅度将给我们提供他需要旅行的距离。
要计算矢量的大小,请将分量平方,将它们相加,然后取结果的平方根。因此,矢量的大小 (20, 15) 是 20 *20 + 15 *15 的平方根,即 25(见图 5-2)。
线数学 (自 x2 + 自 y2) 做大小
计算。Python 中的 ** 运算符将值提高到幂,因此我们可以像数学一样轻松地编写计算。
自我。y*自我。如果您要将numpy导入为np,则可以通过以下方式执行类似操作:
np.sqrt(T.dot(T))
前面是 T 是平移向量(在我们的示例中为 AB)。
最后几行创建一个测试向量,然后调用我们刚刚添加的get_magnitude。如果您手边有一些图表纸,则可能需要绘制点A和B,并验证两者之间的距离是否为25.0。