除非你开发的游戏是一个纯经济模拟器,否则游戏中的角色基本都需要移动。在移动算法中,角色都会有一个当前的位置和可能附加的控制其移动的物理道具,比如一辆车,然后算法使用这些属性来计算出角色下一步应该在哪里。
所有的运动算法都有相同的基本形式:它们获取关于自身状态和世界状态的几何数据,然后给出一个几何形式的输出,来表示它们接下来要进行的移动。下图显示了这一点,角色的速度属性设为可选项,因为只有特定的移动算法才需要它。
有些移动算法只需要很少的输入:例如,只需要角色的位置和要追赶的敌人的位置。另一些则需要与游戏状态和关卡几何结构进行大量的交互:例如,避免撞到墙壁的移动算法需要访问墙壁的几何图形来检查潜在的碰撞,比如开启《QQ飞车》手游里碰撞避免模式后赛车接近阻挡后会自动减速加拐弯。
输出也可以有所不同,在大多数游戏中,让移动算法输出所需的速度是常见操作,例如,一个角色可能会看到西边的敌人,并回应说它应该全速向西移动。而老游戏中的角色通常只有两种速度:静止速度和奔跑速度(可能还有步行速度,用于巡逻),所以这种游戏的移动系统输出只是一个移动的方向,这是运动学上的移动,它没有考虑角色的加速和减速。
现在考虑更多的物理性质是很普遍的,产生运动算法,我称之为 “转向行为”。这类型算法产生的移动不是运动学的,而是动态的。动态移动考虑了角色当前的运动,通常需要知道角色的当前速度以及它的位置,算法的输出是力或加速度,目的是改变角色的速度。
所以总的来说,动态性又增加了一层复杂性:假设你的角色需要从一个地方移动到另一个地方,运动学算法简单地给出了目标的方向,你的角色沿着那个方向移动,直到它到达,这时算法没有返回任何方向;而动态运动算法需要做的更多,首先,它需要向正确的方向加速,然后当它接近目标时,它需要向相反的方向加速,这样它的速度就会以正确的速度下降,从而在正确的位置减速。在本文和后面的所有文章中,我将所有动态运动算法都称作“转向行为”。
克雷格•雷诺兹(Craig Reynolds)发明了群集算法(flocking),该算法被用于无数电影和游戏中,使鸟群或其他动物的群体动起来。在后面的