游戏中几种简单的追踪AI

(一)基本追踪AI
实现原理:当追踪者的x、y坐标分别小于被追踪者的x、y坐标事,追踪者的x、y自增
当追踪者的x、y坐标分别大于被追踪者的x、y坐标事,追踪者的x、y自减
假设追踪者的坐标是predatorX和predatorY,被追踪者的坐标是preyX和prey,基本追踪的算法 如下

```
if(predatorX<preyX)
	predatorX--;
else if(predatorX>preyX)
	predatorX++;
if(predatorY<preyY)
	predatorY++;
else if(predatorY>preyY)
	predatorY--;
```

这是最简单的追踪方法,但是实现效果不是很自然,比较好的方法是采用实现追踪法,即让追踪者沿着和被追踪者之间的直线方向前进。
在这里插入图片描述
(二)向量追逐
一种易于实现视线追逐的方法是,将追踪者的方向向量设置为,从追踪者的中心到被追踪者的中心所定义的方向向量(下图中的dd)
在这里插入图片描述
向量追踪的基本算法如下

计算从追踪者到追踪目标的向量
dd=(AimX-xpos,AimY-ypos);
将dd归一化
dd=dd/Vector_len(dd);
调整追踪者当前的速度向量,可以加一个rate按比例缩放
xpos+=dd.x*rate;
ypos+=dd.y*rate;

(三)拦截
前面两种追踪都是追踪者跟在被追踪者后面,如果追踪者的速度比被追踪者慢,那么将永远追不上。比较合理的方法是在被追踪者前进的路径上的某个点进行拦截
在这里插入图片描述
拦截主要考虑的是拦截点的计算

  1. 拦截点不是被追踪者路径上离追踪者最近的点
  2. 拦截点的计算需要考虑到让追踪者和被追踪者同时到达某一点
  3. 为了让追踪者和被追踪者同时到达某一点,必须考虑他们之间的相对速度。对被追踪者的速度需要通过检测它在两帧之间的位移来计算,应为他的速度是实时变化的,所以拦截点也是实时变化的

拦截的基本算法如下

计算两帧之间被追踪者的速度Vprey
计算追踪者与被追踪者之间的速度差(靠拢速度)Vr=Vprey-Vpredator
计算靠拢距离Sr=Sprey-Spredator
计算靠拢时间Tc=||Sr||/||Vr||
计算拦截点St=Sprey+(Vprey)*Tc
计算追踪者的位移
	计算追踪者与拦截点的相对距离
	S=St-Ppredator
	调整追踪者的速度
	Vpredator=S/Tc
	计算追踪者的位移
	Ppredator+=Vpredator*fDeltaTime

猜你喜欢

转载自blog.csdn.net/YYYJ_BOY/article/details/89295637