代码https://resources.oreilly.com/examples/9780596005559/
移动模式是制造智能行为幻觉的简单方式。
实现移动模式的标准做法是选取想要的模式,再将控制数据填入某个数组或多个数组。控制数据由特定的移动指令组成,比如向前移动再转弯,借此迫使计算机控制的物体或者角色按所需模式移动。利用这些算法,你可以建立圆形、方形、蛇形、曲线以及任何类型的模式,将之编制成一组精确的移动指令。
标准算法
控制指令数据结构
ControlData {
double turnRight; // 角度
double turnLeft;
double stepForward; // 距离
double stepBackward;
}
通过编写指令数组来实现移动
砖块环境中的移动模式
比如猎物在以矩形移动模式完成守卫或巡逻,路径由几条线段构成。你必须确保最后一条线段的终点是第一条线段的起点。
entityList[1].InitializePathArrays(); //初始化路径
// 构建路径线段
entityList[1].BuildPathSegment(4, 2, 4, 11);
entityList[1].BuildPathSegment(4, 11, 2, 24);
entityList[1].BuildPathSegment(2, 24, 13, 27);
entityList[1].BuildPathSegment(13, 27, 16, 24);
entityList[1].BuildPathSegment(16, 24, 13, 17);
entityList[1].BuildPathSegment(13, 17, 13, 13);
entityList[1].BuildPathSegment(13, 13, 17, 5);
entityList[1].BuildPathSegment(17, 5, 4, 2);
//
entityList[1].NormalizePattern();
entityList[1].patternRowOffset=5;
entityList[1].patternColOffset=2;
其中BuildPathSegment是修改后的Bresenham算法
NormalizePattern将模式标准化,使其以相对坐标表示,而非绝对坐标。需要把存储在模式数组中的所有位置都减去起始位置即可。
仿真物理环境中的移动模式
结合物理模型
控制结构
移动模式控制数据结构体
struct ControlData {
bool PThrusterActive;
bool SThrusterActive;
double dHeadingLimit;
double dPositionLimit;
bool LimitHeadingChange;
bool LimitPositionChange;
}