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

AI が 180° 回転することを許可しないでください。最後の shipDir 方向 (角度) を記憶し、90° 回転 (shipDir に対して +/- 1) のみを許可してください。

于 2013-09-14T14:58:52.473 に答える
0

LERP は良い方法の 1 つです。

別の見方をするのも一つの方法です。慣性と単純な物理を追加できます。そのため、速度を直接変更することはできませんが、代わりに自分自身に力を加えることができます。プレイヤーとオブジェクトがバネでつながっていると考えてください。

自然にターンが広くなり、動的に変更できるようになります。

F = versor * constantここで、versor はオブジェクトからプレーヤーを指しています。

于 2013-09-14T21:12:01.697 に答える