这篇主要讲我们在项目中遇到的团队移动问题以及对应的解决方案。
这次的项目中,我们需要角色们在一个高度自由的二维场景中移动。其实二维场景的移动因为仅仅涉及两条轴而相对简单很多,可是引入一些其他需求之后难度就会相对提升。
这次我们引入的另一个要求就是角色们需要按照一定的队形移动,移动不能太死板,可是队形不能变。这就好比我们学生时候走队列,走过跑道弯曲部分队列也是弯曲的,可是该是几列纵队还是几列。我们这一次就是需要实现类似的内容。
得到了问题,下一步就是分析应该用什么方法做了。在分析中,我简化问题为求单列总队的队形移动实现,因而总结了三种实现原理:
- 以队长为核心,所有人相对队长的位置与方向站位。
- 以队中前一人为核心,每个人相对前一人的位置与方向站位。
- 以队中前一人为核心,每个人固定距离追随前一人。
有了初步的思路,接下来其实就是选择的过程了,只有明确优缺点,才能选择出最适合我们自己的方案。
**优点:**实现最简单,队形固定。
**缺点:**因为队形固定,所以队伍在移动与旋转时是按照队形移动与旋转的,不符合需求。
**优点:**队形稳定,且队伍移动与旋转时队形保持队形不变。
**缺点:**在队伍行进中旋转方向变化时,队尾位置因叠加而导致位移距离过大而会发生瞬移现象,无法满足当前问题。
**优点:**同方案2, 而且相比方案2在移动时旋转更为平滑且不会发生瞬移现象
**缺点:**当队列的队长(队头)在移动时要从队伍中穿过去,队尾的移动会变小甚至停止。
当优缺点都分析完之后,我们毫不犹豫选择了方案3。
方案3的缺点主要集中在队头穿插自身时出现的问题,那会造成一种类似舞龙的效果,不过这个问题在我们的项目中因为队伍一直在高速移动且队伍不会太长,因而正好避免了这种情况的发生。
当方案选定,那么下一步就是正确去解决问题了。
当我们选定了方案之后,其实还有一件事要解决:纵队满足了需求,横排如何实现?
根据我们自己走队列的经验:一个方阵总是保证横排是固定的,一旦遇到旋转的问题,总是内角的人走得慢,外角的人走得快,以保证队列的横排的整齐。
所以根据经验,我们可以总结我们的实现原理:
选取一个点作为横排的中点,横排中的成员便可依据中点进行位置偏移获得位置数据。
当队形的方案确定,且横排的实现原理也确定之后,我们就可以获得队形整体的实现原理:
整个队形按照一字长蛇阵实现,一字长蛇阵中的每一个点作为对应所在横排的中点,并使用中点计算横排具体队员的位置数据。
这次的问题的解决方案,核心思想依旧是分治。
我们首先使用一字长蛇阵,以此确定队形位移时的“龙骨”。
之后在一字长蛇阵的每一个节点之上,我们通过其位置求取同排具体成员位置信息。
在这里我们暂时使用了两层,只是为了表述清楚问题的实现原理。而在实际我们的项目代码中,因为还存在 队形的变换 以及 队伍中人员超越 的问题,因而在第二层的节点还有多层抽象以满足我们的需求。