4

私はこれを数日間無駄にしようとしてきましたが、基本的にはいくつかのクリーチャーとプレイヤーが画面に表示されています。私が望んでいるのは、敵が位置に「ロック」してすぐにプレイヤーに直面するのではなく、可変速度でプレイヤーに向くようにすることです。

私がやろうとしているのは、特定の敵が時計回りに回転するか反時計回りに回転してプレイヤーに向かう方が速いかを判断することですが、三角法では私の能力を超えていることが証明されています.

例:

ここに画像の説明を入力

xこれらの図の は、それぞれの状況で回転させたい「短い」パスと方向を表しています。

次のいずれかを使用して、この状況で「時計回り」または「反時計回り」を解決する最も簡単な方法は何ですか?

  • 敵が向いている方向。
  • 敵とプレイヤー、プレイヤーと敵の間の角度。
4

2 に答える 2

8

方向ベクトルがあると仮定すると、ここで角度を計算したり、三角関数を使用したりする必要はありません。

var pos_x, pos_y, dir_x, dir_y, target_x, target_y;
if ((pos_x - target_x) * dir_y > (pos_y - target_y) * dir_x) {
    // Target lies clockwise
} else {
    // Target lies anticlockwise
}

これは、オブジェクトが向いている方向にオブジェクトを通る架空の線を描画し、その線のどちら側にターゲットがあるかを判断するだけです。これは基本的な線形代数であるため、角度から方向ベクトルを計算する必要がない限り、この関数のどこでもなどsin()を使用する必要はありません。cos()

これも右手座標系を使用します。左手座標系を使用している場合は逆になります。式は同じですが、「時計回り」と「反時計回り」が入れ替わります。

より詳細な説明:この関数は、フォワードベクトル(dir_x, dir_y)とターゲットへのベクトルの外積を計算し(target_x - pos_x, target_y - pos_y)ます。結果として得られる外積は、ターゲットが時計回りか反時計回りかに応じて、正または負の擬スカラーになります。

ベクトルのクラッシュコース

ベクトルは、大きさ方向です。たとえば、北に3 km、または下に6センチメートルです。デカルト座標(x、y)を使用してベクトルを表すことも、極座標(r、θ)を使用してベクトルを表すこともできます。どちらの表現も同じベクトルを提供しますが、使用する数値と式は異なります。一般に、極座標ではなくデカルト座標を使用する必要があります。あなたがゲームを書いているなら、極座標はひどくひどいです—それらはあなたのコードをsin()どこにcos()でも散らかします。

コードには3つのベクトルが含まれています。

  • ベクトル(pos_x, pos_y)は、原点を基準にしたオブジェクトの位置です。

  • ベクトル(target_x, target_y)は、原点を基準にしたターゲットの位置です。

  • ベクトル(dir_x, dir_y)は、オブジェクトが向いている方向です。

于 2013-02-11T07:23:30.293 に答える
1
const CLOCKWISE:int = 0;
const COUNTER_CLOCKWISE:int = 1;
const PI2:Number = Math.PI * 2


function determineSmallestAngle(from:Sprite, to:Sprite):int
{
    var a1:Number = Math.atan2(to.y - from.y, to.x - from.x);
    var a2:Number = from.rotation * Math.PI / 180;

    a2 -= Math.floor(a2 / PI2) * PI2;

    if(a2 > Math.PI) a2 -= PI2;

    a2 -= a1;

    if (a2 > Math.PI) a2 -= PI2;
    if (a2 < -1 * Math.PI) a2 += PI2;

    if (a2 > 0) return CLOCKWISE;
    return COUNTER_CLOCKWISE;

}
于 2013-02-11T07:15:06.000 に答える