0

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

}
4

3 回答 3

1

一个很好的方法是使用Linear Inerpolition这对于这样的事情非常有用。一个简单的 LERP 函数如下所示:

public double lerp(double x, double y, double speed){
    return (y - x) * speed;
}

然后,您可以将此函数称为:

dir = lerp(dir, newDir, .01);

然后简单地减少/增加速度变量,直到你让它看起来像你想要的那样。

Linear Interpoliton 在网络方面也非常有用。

于 2013-09-14T15:04:20.230 回答
1

不要让您的 AI 进行 180° 转弯,记住您上次的 shipDir 方向(角度)并只允许 90° 转弯(+/- 1 到 shipDir)。

于 2013-09-14T14:58:52.473 回答
0

LERP 是一种很好的方法。

另一种方法是采取不同的观点。您可以添加惯性和简单的物理。所以它不能直接改变它的速度,而是只能对自己施加力。想象一下玩家和您的对象通过弹簧连接。

它应该自然地使转弯更宽,并且您将能够动态修改它。

F = versor * constant,versor 从你的对象指向玩家。

于 2013-09-14T21:12:01.697 回答