如何让艾慢转?

时间:2013-09-14 14:37:07

标签: java artificial-intelligence game-physics

场景:我想让对象以给定的速度跟随玩家。我已经制作了使对象跟随播放器(可以工作)的代码。为了使对象跟随玩家,我检查了对象的哪一侧,然后根据它计算出需要影响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));
    }

}

3 个答案:

答案 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从你的对象指向玩家。