0

私がここで抱えている奇妙な問題。敵の視野を実装しました。これにより、プレーヤーが検出可能な領域(正面120度の円錐)内を移動すると、FOVの外に出るまで悪者に追われます。

問題は、120 FOVのコーンが敵からも戻ってくることです。そのため、2つのコーンがあり、1つは前、もう1つは後ろにあり、前の1つだけを使用します。私が考えることができる唯一のことは、私が合格したPIをオーバーフローしているということですか?よくわかりません。

このチュートリアルを使用して、ベクトル数学を使用してこれを実装しました。ドット積セクション。 http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

これがFOVに関連するコードです。

 Vector2 EnemyVecAngle = new Vector2((float)Math.Cos(EnemyAnimation.Angle), (float)Math.Sin(EnemyAnimation.Angle));

        //normalize
        Vector2 EnemyFacingN = Vector2.Normalize(EnemyVecAngle);
        Vector2 EnemytoPlayer = Vector2.Normalize(player.Position - Position);

        //check angle
        float CheckAngle = (float)Math.Acos(Vector2.Dot(EnemyFacingN, EnemytoPlayer));

if ((CheckAngle >= 60) && (CheckAngle <= 120)
following = true;

これは、一度検出されると敵をプレイヤーに向けさせるステートメントです

EnemyAnimation.Angle = (float)Math.PI / -2 + (float)Math.Atan2(Position.Y - player.Position.Y, Position.X - player.Position.X);

なぜそれが機能するために-PI/2を追加する必要があるのか​​疑問に思っています、これは問題に関連している可能性があると思います。どんな助けでも大歓迎です!

4

1 に答える 1

1

Math.PI / -2を追加すると、テクスチャが90度回転すると思います。

Atan2を使用する必要があります:

    Vector2 EnemyVecAngle = new Vector2((float)Math.Cos(EnemyAnimation.Angle), (float)Math.Sin(EnemyAnimation.Angle));

    //normalize
    Vector2 EnemyFacingN = Vector2.Normalize(EnemyVecAngle);
    Vector2 EnemytoPlayer = Vector2.Normalize(player.Position - Position);

    //check angle
    float CheckAngle = (float) (Math.Atan2(EnemyFacingN.Y, EnemyFacingN.X) 
                              - Math.Atan2(EnemytoPlayer.Y, EnemytoPlayer.X) );  

それで十分なはずです...Atant2は直角の符号を処理します...ただし、新しい計算された角度を調べて、適切な範囲を選択します...

于 2012-05-02T21:46:16.700 に答える