场景:我想让对象以给定的速度跟随玩家。我已经制作了使对象跟随播放器(可以工作)的代码。为了使对象跟随玩家,我检查了对象的哪一侧,然后根据它计算出需要影响x和y值以使其朝那个方向移动的速度。
问题:如果玩家要绕过Ai,Ai会急转弯以便到达玩家。我想要的是让它变得不那么尖锐而转而变宽的东西。
有什么问题吗?请问!
我的代码:
public void facePlayer(){
double division = (double)Math.abs(player.getY() - enemyy) / Math.abs(player.getX() - enemyx);
dir = Math.atan(division);
dir = lerp(dir,division,spd);
if (enemyx >= player.getX() && enemyy <= player.getY()) {
enemyx -= (spd * Math.cos(dir));
enemyy += (spd * Math.sin(dir));
}
//if Coin is top left
if (enemyx >= player.getX() && enemyy >= player.getY()) {
enemyx -= (spd * Math.cos(dir));
enemyy -= (spd * Math.sin(dir));
}
//if Coin is bottom right
if (enemyx <= player.getX() && enemyy <= player.getY()) {
enemyx += (spd * Math.cos(dir));
enemyy += (spd * Math.sin(dir));
}
//if Coin is bottom left
if (enemyx <= player.getX() && enemyy >= player.getY()) {
enemyx += (spd * Math.cos(dir));
enemyy -= (spd * Math.sin(dir));
}
}
答案 0 :(得分:1)
不要让你的AI转180°,记住你的最后一个shipDir方向(角度)并且只允许90°转弯(+/- 1到shipDir)。
答案 1 :(得分:1)
这样做的一个好方法是使用Linear Inerpolition这对于这样的事情很有用。一个简单的LERP函数看起来像这样:
public double lerp(double x, double y, double speed){
return (y - x) * speed;
}
然后您可以将此功能称为:
dir = lerp(dir, newDir, .01);
然后简单地减小/增加速度变量,直到你看到你想要它为止。
线性Interpoliton在网络方面也非常有用。
答案 2 :(得分:0)
LERP是一种很好的方法。
另一种方式是采取不同的观点。你可以添加惯性和简单的物理。所以它不能直接改变它的速度,而是它只能对自己施加力。想想玩家和你的物体通过弹簧连接。
它应该自然地使转弯更宽,并且您将能够动态地修改它。
F = versor * constant
,其中versor从你的对象指向玩家。