仓库: https://gitee.com/mrxiao_com/2d_game
简介
目前我们正在研究的内容是如何构建一个基本的游戏引擎。我们将深入了解游戏开发的每一个环节,从最基础的技术实现到高级的游戏编程。
角色移动代码
我们主要讨论的是角色的移动代码。我一直希望能够使用一些基本的数学和游戏开发的基本矢量数学技术。然而,直到昨晚,我才为大家做了一个数学概述,介绍了在游戏开发中涉及的各种类型的数学。今晚,我们将进行第一次的实验,展示如何使用一些这些数学原理来实现角色的移动。通过使用两个二维矢量映射,我将展示它们是如何运作的,以及我们如何利用它们来实现角色在游戏中的移动。这将是我们工作的起点,帮助我们在游戏中获得一些良好的角色动作。
回顾
让我们从这里开始,看看这些东西。我决定继续使用我正在使用的平板电脑,即使我可能需要用painter来画一些图和线条,因为我觉得这可能会帮助我更好地理解和解释一些概念。虽然使用钢笔可能会给我带来一些困难,但我们要试一试,也许至少在这一集里,我可以适应它。
回忆一下,如果你记得的话,这是我们所停留的地方。我们做了很多工作,关于一些基础的东西。我们测试了滚动,允许自己创造了一个巨大的地图。所以,你知道,我们做了稀疏样式的地图存储,也做了许多其他的事情。但我们现在必须开始考虑如何让我们的角色进行移动。我们现在的角色移动代码是最糟糕的,是最基本的,最令人讨厌的移动代码。我甚至没有提到他还没有进行动画,因为这也是我们要解决的问题,但我说的只是比这更低层次的东西,即使只是让角色进行基本的移动。
当前角色移动代码的问题
你可能会注意到,角色的移动感觉并不好。一个主要问题是角色没有任何动量。现在,基本上所有的事情都发生在你按下按键的时候,他只是随着你按住键移动。一旦你松开了按键,他就停了。此外,还存在一些奇怪的现象。例如,如果我以某个速度向下移动,我的速度是固定的。但如果我同时向右和向下移动,我实际上会以两者速度的结合下移动。这种现象在对角线上显得尤为奇怪,因为角色移动的速度会加快。这也是一种不太令人满意的现象,因为如果我向上移动,角色在穿越一个虚拟门后加速,去到下一个图层。
这些现象最终导致了很多问题。角色非常容易被各种小障碍物卡住,很难穿过门。任何微小的偏差都会导致角色完全停止。这些问题使得玩家的移动感觉很糟糕,这就是我们希望改进的地方。
我们想要做的事情
所以除了这些问题,我们还希望做的就是让玩家的体验更有趣。当他们在游戏中移动角色时,这个动作应该更具吸引力,因为在这样的游戏中,玩家需要不断移动角色,躲避敌人等。他们的角色始终在屏幕上移动,从左到右,他们一直在进行这些操作。因为移动角色是他们游戏中的主要动作之一,所以我们希望提供更多的操作感和互动,让玩家觉得他们的角色更有趣、更充实。
什么使得游戏具有吸引力
所以,视觉和触觉反馈对于游戏而言是非常重要的,因为它们使游戏变得有趣。当玩家在游戏中移动时,他们需要能够感受到这种反馈,这会让他们觉得自己真正参与其中。视频游戏不同于传统的棋盘游戏,它通过音频视觉反馈来吸引玩家。这些反馈不仅仅是表面的,它们让玩家感受到动作的真实性和游戏的吸引力。一个好的游戏不仅仅是机制本身,还包括了让玩家有兴趣继续玩下去的那些细节。这些细节包括移动感、跳跃的感觉等,确保玩家在每个操作时都能体验到愉悦和成就感。我们希望在接下来的时间里,通过优化角色的移动方式来实现这种吸引力。
为什么需要向量数学
我们正在学习如何使用基本的矢量数学来改善角色的移动。通过这种方式,我们可以使角色在游戏中的运动更加流畅、更加符合玩家的需求,这样玩家在操作角色时能够感受到视觉和触觉上的满足感。这种方式的运动设计不仅能够让角色移动起来感觉很好,还能够激发玩家的兴趣,使他们更想操作这个角色。这就是我们目前所要达到的目标,即让角色的移动既有吸引力又令人满意,使玩家在每次操作时都感到愉悦。
应该开始修复的内容
我们要解决角色在移动时的动量问题,让他不会瞬间停下来,然后再开始,同时也解决他在对角线方向移动时速度加快的问题。通过学习基本的向量数学,我们可以轻松地修正这些问题。这将使角色在所有方向上移动更加一致,改善玩家的体验。让我们开始尝试解决这些问题吧。
向量数学简介
我们正在讨论矢量在游戏开发中的应用。向量不仅帮助我们处理诸如玩家的速度和方向等变量,还使得它们之间的关系变得更加紧密。例如,在处理角色的移动时,如果我们只看水平或垂直方向,它们就像独立的变量一样,但实际上它们是相互关联的。在实际操作中,角色的对角线移动涉及到两者的结合。这种耦合使得处理起来更直观、更高效,因为数学家早已为我们定义了所有可以对向量进行的基本操作。通过这些操作,我们可以更好地控制和优化游戏的体验。
草图
我们在讨论一个对象的运动时,特别是在游戏开发中,如何理解玩家在屏幕上的移动。我们使用勾股定理来解释这个问题。玩家在游戏中被视为在一个二维空间中移动,通过结合x和y轴的移动来创建一个对角线路径。这种对角线路径并不是玩家实际移动的两个单独的方向,而是这两个方向的综合表现。因此,尽管玩家在x和y轴上移动的距离分别为d和d,最终的路径长度却是勾股定理的平方根。
这解释了为什么玩家可能会看到比实际移动更长的路径,这被称为“幻影远距”。它并不是两个距离的简单相加,而是形成了一个更长的路径,这是因为它在两者之间形成了一个对角线。因此,尽管它们的移动速度可能是相同的,玩家看到的路径却是它们的勾股定理计算得出的更长的距离。
在游戏开发中,这一理解是重要的,因为它帮助我们优化运动轨迹,使得玩家感觉到的游戏体验更加真实。
移动标量问题
在对角线移动时,我们可以使用勾股定理(a² + b² = c²)来计算目标距离(d)。我们首先通过平方根将这个距离除以2来得到一个比例因子(v)。然后,基于该因子,我们可以在移动过程中将它们相乘来确定实际的移动量。这一过程允许我们计算在对角线方向上进行相等移动的需要的速度或距离。
v 2 + v 2 = d 2 d 2 = 2 v 2 v = d 2 2 v = d 2 2 v = d 2 2 v = 0.7071067811865475 ∗ d v^2 + v^2 = d^2 \\[1em] d^2 = 2v^2 \\[1em] v = \sqrt{\frac{d^2}{2}} \\[1em] v = d\frac{\sqrt{2}}{2} \\[1em] v = d\frac{\sqrt{2}}{2} \\[1em] v = 0.7071067811865475*d v2+v2=d2d2=2v2v=2d2v=d22v=d22v=0.7071067811865475∗d
转向向量
我们讨论了矢量如何帮助我们简化问题。矢量实际上是多个信息片段的结合,允许我们以直观的方式操作这些片段,而无需关注低级数学细节。例如,当我们使用矢量时,不再需要思考逐步运动,而是可以直接从原点到目的地的直接移动。矢量概念在多维空间中同样适用,无论是二维、三维,甚至更多维度。它们帮助我们在更高层次上思考和处理问题,使得游戏开发中的各种计算变得更加高效和简洁。矢量不仅仅是简单的数学工具,它们在我们的工作中赋予了深刻的概念和语义。
转向向量(direction vector)是表示一个向量在几何空间中的方向的向量。它通常通过两个或多个点之间的差异来定义。例如,给定两个点 $A(x_1, y_1, z_1)$ 和 $B(x_2, y_2, z_2)$,其转向向量 $\vec{D}$ 可以通过以下公式计算:
D ⃗ = ( x 2 − x 1 , y 2 − y 1 , z 2 − z 1 ) \vec{D} = (x_2 - x_1, y_2 - y_1, z_2 - z_1) D=(x2−x1,y2−y1,z2−z1)
这种转向向量的计算方式反映了从点 $A$ 到点 $B$ 的方向和大小。
在更广泛的数学和物理学中,转向向量可以应用于描述运动方向,速度矢量,力矢量等。例如,在物理学中,一个物体的运动速度可以用一个转向向量表示,这个向量指示物体的运动方向和速度的大小。
举例:
假设点 $A(2, 3, 4)$ 和点 $B(5, 7, 10)$,我们可以计算它们之间的转向向量:
D ⃗ = ( 5 − 2 , 7 − 3 , 10 − 4 ) = ( 3 , 4 , 6 ) \vec{D} = (5 - 2, 7 - 3, 10 - 4) = (3, 4, 6) D=(5−2,7−3,10−4)=(3,4,6)
这个向量 $(3, 4, 6)$ 表示从点 $A$ 到点 $B$ 的方向,以及从 $A$ 到 $B$ 的距离(大小)。
向量符号
我们在讨论矢量时,主要是在谈论如何组合多个信息片段。矢量可以通过竖直排列的方式来书写,这与传统的水平排列不同。这种书写方式反映了矢量在多维空间中的位置和方向。例如,一个向量可以被视为一个二维或三维的矩阵,其列或行代表特定方向上的量。而这种书写方式的选择影响了我们对矢量进行操作时的理解和处理方式。因此,决定如何书写这些对象非常重要,特别是在保持数学一致性的前提下。尽管代码编辑器不允许在中间插入垂直排列的矢量,但这种写法仍然是描述和理解矢量的直观方式。在代码中,我们通常会以这种方式来书写向量,尽管它可能在代码编辑器中有些不便。总体来说,理解和使用矢量的这种方式有助于我们在处理多维数据时更高效。
向量和矩阵之间有着紧密的关系,特别是在数学和计算机科学领域中。理解它们的关系可以帮助我们更好地理解和操作多维数据。
向量
一个向量是由一个或多个数值组成的对象,它在数学中被用来表示方向和大小。例如,一个二维向量可以表示一个点在平面上的位置,而一个三维向量可以表示一个点在三维空间中的坐标。
- 二维向量: $\vec{v} = \begin{pmatrix} x \ y \end{pmatrix}$
- 三维向量: $\vec{v} = \begin{pmatrix} x \ y \ z \end{pmatrix}$
矩阵
矩阵是一组由数字(元素)组成的表格,可以用来表示多个向量的线性组合。矩阵的元素通常用来描述系统的线性关系。例如,一个二维矩阵可以表示一个线性变换,如旋转或缩放。
-
二维矩阵:
A = ( a 11 a 12 a 21 a 22 ) A = \begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix} A=(a11a21a12a22) -
三维矩阵:
B = ( b 11 b 12 b 13 b 21 b 22 b 23 b 31 b 32 b 33 ) B = \begin{pmatrix} b_{11} & b_{12} & b_{13} \\ b_{21} & b_{22} & b_{23} \\ b_{31} & b_{32} & b_{33} \end{pmatrix} B= b11b21b31b12b22b32b13b23b33
行列关系
-
向量可以看作是矩阵的“列”:
- 一个向量 $\vec{v}$ 可以被看作是一个 $n \times 1$ 矩阵。
- 例如,二维向量 $\vec{v} = \begin{pmatrix} x \ y \end{pmatrix}$ 是一个 $2 \times 1$ 矩阵。
-
矩阵的乘法:
- 当一个向量乘以矩阵时,结果是另一个向量。
- 如果矩阵 $A$ 的列数等于向量的大小,矩阵乘法的结果将是一个新的向量。
-
矩阵的行和列:
- 矩阵的每一行可以看作是一个向量。
- 矩阵的每一列也可以视为一个向量。
- 例如,对于一个 $2 \times 3$ 矩阵:
A = ( 1 2 3 4 5 6 ) A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} A=(142536)
每一列 $\begin{pmatrix} 1 \ 4 \end{pmatrix}$ 和 $\begin{pmatrix} 2 \ 5 \end{pmatrix}$ 都是向量。
-
转置矩阵:
- 矩阵的转置操作(将矩阵的行转变为列)常用于向量和矩阵之间的操作。例如,矩阵的转置 $A^T$ 将 $A$ 中的每个列变成行。
行列操作示例
-
向量和矩阵的加法:
- 设 $\vec{v} = \begin{pmatrix} x \ y \end{pmatrix}$ 和 $\vec{w} = \begin{pmatrix} u \ v \end{pmatrix}$ 是两个向量。
- $\vec{v} + \vec{w} = \begin{pmatrix} x + u \ y + v \end{pmatrix}$
-
向量和矩阵的乘法:
- 设矩阵 $A$ 是一个 $2 \times 3$ 矩阵,$\vec{v} = \begin{pmatrix} x \ y \end{pmatrix}$ 是一个 $2 \times 1$ 向量。
- 矩阵乘法得到的向量为:
A v ⃗ = ( 1 2 4 5 ) ( x y ) = ( 1 x + 2 y 4 x + 5 y ) A\vec{v} = \begin{pmatrix} 1 & 2 \\ 4 & 5 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 1x + 2y \\ 4x + 5y \end{pmatrix} Av