4

敵船とプレイヤー船があります。

敵の船は、プレイヤーが動いているときでも、常に直線でプレイヤーに向かって飛んでほしいと思います。

これについては、C#XNAのRayクラスを使用して行います。

光線の位置/原点(プレーヤーの現在の位置)と光線の方向(敵の現在の位置)の2つのベクトル座標があります。敵の位置を徐々にプレイヤーの位置に向かって動かしてほしい。

私はこれまでこのコードを持っています。

enemyPlayerTrack.Position = playerPos;
enemyPlayerTrack.Direction = enemyPos;

速度に別のベクトルが必要かどうかわかりません。

最終的に、敵は次のコードで新しい位置で画面に描画されます。

enemyWorldMatrix = Matrix.CreateTranslation(new Vector3(x, y, z));

数学的な背景がないと、2つのベクトルをどんどん近づける速度を作成するのに苦労しています。

4

3 に答える 3

2

速度を選択しますs。次に、敵からのプレーヤーの方向は次のとおりです。

dir_x = player_x - enemy_x
dir_y = player_y - enemy_y

全体的な速度s=sqrt(vel_x ^ 2 + vel_y)^ 2なので、dirベクトルをスケーリングして速度を求めます。

factor = s / sqrt(dir_x^2 + dir_y^2)
vel_x = dir_x * factor
vel_y = dir_y * factor

そのため、敵は常に同じ速度で飛行し、プレイヤーに向けられます。しかし、プレイヤーが敵の近くにいる場合、敵はオーバーシュートし、プレイヤーの上を前後にバウンドし続けます。したがって、速度を制限します。

distance = sqrt(dir_x^2 + dir_y^2)
delay_to_reaching_player = 2    // some measure of time
enemy_speed = min(s, distance/delay_to_reaching_player)

このように、遅延を設定することにより、敵が最大速度で移動を停止するのに十分に近づくと、敵はプレーヤーに近づくにつれて減速します。

于 2012-10-11T10:01:16.717 に答える
2

目の前にXNAがないので、これは単なる擬似コードです...

2つの間の合計デルタは単純に次のようになります。

var delta = playerPosition - enemyPosition;

これは方向性を与えますが、通常は間違った大きさです。したがって、次の方法で単位ベクトルに再スケーリングできます。

var magnitude = Math.Sqrt(delta.x * delta.x + delta.y * delta.y +
                  delta.z * delta.z); // however many dimensions you have...
var unitDelta = delta / magnitude; // assuming non-zero; if zero, don't move
var newVelocity = unitDelta * enemySpeed;

ただし、これは勢いに逆らい、非常に基本的なものであることに注意してください(プレーヤーの速度は考慮されていません。AIが愚かであるように感じます)。

于 2012-10-11T10:04:50.727 に答える
0

敵->プレーヤーからのベクトルがある場合、基本的には、敵に適用してプレーヤーの位置にジャンプさせることができる変換があります。ベクトルの全長を「1」に設定するベクトルを正規化して「単位」に戻す必要がありますが、それでもプレーヤーの方向を指している場合は、この値に実際に必要な速度を掛けることができます敵をプレイヤーに向かって移動させることで敵を移動させるベクトルを取得します

人々はすでに答えているので、単位を取得するには、ベクトルの両方の成分の積を合計してから、平方根を取る必要があります。これは、ピタゴラスの定理と結びついています。例:

あなたがベクトルの成分を取る場合は言う

(2,2)

これは次のようになります。

  2 
  ^
  |
  |
--> 2

次に、原点(0,0)とベクトルの終点が交わる点の間に線を引きます-三角形が得られます...

  2
  ^
 /|
/ |
--> 2

この線はベクトルの大きさを表します。両方のコンポーネントの2乗の合計を取り、それをsqrtして、この線の長さを取得します。

2 * 2 + 2 * 2 = 8

sqrt(8) = 2.82

したがって、このベクトルの長さは2.82です。つまり、2と2の値は単一の単位ベクトルの2.82倍のサイズです。

「1」の長さまたは「単位」のコンポーネントを取得するには、ベクトルを正規化する必要があります。これを行うには、各コンポーネントを大きさで除算します。

2 / 2.82 = 0.70

これは正しいと思います-このベクトルの角度は45度です(2を超える2は完全な対角線である必要があります)ので、コサイン/サインはベクトルコンポーネントの水平または垂直の単位長さを提供するため、コサインまたはサインを使用して確認できます与えられた角度に対して

sin(45) or cos(45) = 0.70

スポット

これで、プレーヤーに対する角度が、次のコンポーネントを持つ1つの長さのベクトルを使用することがわかりました。

(0.7, 0.7)

敵を3ユニットプレイヤーに向かって移動させるには、コンポーネントに3を掛けるだけです。

0.7 * 3 = 2.1

それで

(2.1, 2.1)

この物理ステップで敵を3ユニットプレイヤーに向かって移動させます

これはまったく役に立ちますか?

于 2012-10-11T10:25:12.353 に答える