由于代码渐渐多了起来,现在参考实现已经上传到 Github 了。 github仓库地址
既然没有用游戏引擎,再往下就一定要遇到遇到怎么处理子弹反弹,更高级一点诸如渲染阴影。这些游戏必备的数学主要和线性代数中向量有关。再广义一点,游戏还涉及音频的播放之类,如果是联网游戏有游戏玩家间的交流,可能还有处理音频的过程(比如,适当压缩)来减少网络负担,降低延迟。
向量运算
二维向量需要由两个坐标轴来刻画 ( x , y ) (x,y) (x,y),三维向量(空间向量)需要由三个坐标轴来刻画 ( x , y , z ) (x,y,z) (x,y,z)。依此类推,四维向量需要四个,例如在相对论中,除了空间意义上的 ( x , y , z ) (x,y,z) (x,y,z),加上了时间意义的上的 t t t,构成了爱因斯坦描述的四维空间。但是,处于三维空间的我们是无法画出这玩意的。换句话说,可视化只能最多是三维的。
向量的运算和算术运算有一些差异。有一些简单的概念可以稍微复习一下:
- 向量的加(减)法:对应坐标维度相加(减): ( x 1 , y 1 ) + ( x 2 , y 2 ) = ( x 1 + x 2 , y 1 + y 2 ) (x_1,y_1)+(x_2,y_2)=(x_1+x_2,y_1+y_2) (x1,y1)+(x2,y2)=(x1+x2,y1+y2)、 ( x 1 , y 1 ) − ( x 2 , y 2 ) = ( x 1 − x 2 , y 1 − y 2 ) (x_1,y_1)-(x_2,y_2)=(x_1-x_2,y_1-y_2) (x1,y1)−(x2,y2)=(x1−x2,y1−y2)
注意,向量的加减法几何意义上遵循的是三角形法则。
减法的原则可以简单记为:起点相同,指向被减。(起点不同?那就平移到相同~)
在乒乓球游戏那篇,就已经给出了二维向量的简单实现:
// Vector2 结构体仅存储 x 和 y 坐标
struct Vector2
{
float x;
float y;
};
- 向量的数乘,几何意义上是放缩向量的长度: λ ⋅ ( x , y ) = ( λ x , λ y ) \lambda \cdot (x,y)=(\lambda x, \lambda y) λ⋅(x,y)=(λx,λy)
- 向量的长度(模),这里用到的其实就是勾股定理: ∣ ∣ x ∣ ∣ = a x 2 + a y 2 ||x||=\sqrt{a_x^2+a_y^2} ∣∣x∣∣=ax2+ay2
- 向量的标准化(归一化?)(通常用于确定向量方向): a ⃗ = ( a ⃗ x ∣ ∣ a ⃗ x ∣ ∣ , a ⃗ y ∣ ∣ a ⃗ y ∣ ∣ ) \vec a = (\frac{\vec a_x}{||\vec a_x||}, \frac{\vec a_y}{||\vec a_y||}) a=(∣∣ax∣∣ax,∣∣ay∣∣