1

この一見よくある質問に対する答えは、驚くべきことに、あちこち検索しましたが、見つかりませんでした。私が現在直面している問題は、プレイヤーが敵に直面しているかどうかを確認することです。敵に直面している場合は、プレイヤーの視界の範囲内 (調整可能) であり、その範囲内にある場合は、最も近い安全な方向に移動します。

ここに写真があります:D 例

それで、どうすればこれを達成できますか?すべての船オブジェクトの、xyおよびがあります。directionこれは、プレイヤーの方向が敵の方向から正確に 180 度離れていることを考慮しようとして、最後に失敗した試みです。

var direction=Math.direction(this.x,this.y,player.x,player.y,1),
    playerview=Math.abs(direction)-Math.abs(player.direction-180)
if(Math.abs(playerview)<10) {
    console.log('in view')
    this.xVelocity+=AI.speed*Math.sin(playerview*Math.PI/180)
    this.xVelocity+=AI.speed*Math.cos(playerview*Math.PI/180)
    }

この例で10は、範囲になります。もちろん、船を右に回転させることしかできていないので、探知が半円しか効かないのとは別に、敵を右に回転させることもできません。何か案は?

4

1 に答える 1

0

あなたのコードでは、 this.xVelocity を変更する代わりに 2 回変更してthis.yVelocityいます。

Math.directionJavaScript/ECMA 標準には含まれていないと思います。本当に、正しく使用していますか? を検討してくださいMath.atan2

さらに、 「向かい合う」の定義を提供する必要があります。

もしそれが「お互いに会っている」なら、あなたの「見えている」というコメントは誤解を招くものです。


しかし、主な問題は次のとおりです。

Math.abs(angleInDegrees) 角度を変更します!

角度の絶対値を作成する正しい方法は次のとおりです。

while (angleInDegrees < 0) 
{   
   angleInDegrees += 360;
}

// If necessary, add this too:
while (angleInDegrees >= 360)
{
   angleInDegrees -= 360;
}

-10 と 350 は同一で、-10 と 10 は 20 度離れています。

詳細については、上記のコードを呼び出してみましょうnormalizeAngle

(注: 巨大な値の場合、ループは非常に長く実行されるか、永久に実行されることさえあります。そのような値が発生する可能性がある場合は、これをチェックする必要があります。)


次のようにしてください。

playerview = normalizeAngle(direction - player.direction - 180)
if (playerview < range || playerview > 360-range) {

ちなみに、「playerview」は、プレイヤーの視野と敵の視野から最小にする必要があります。

于 2012-04-04T11:29:21.820 に答える