2012-03-01 10 views
0

私は作っているゲームを持っています。私は2つのスプライトを持っており、AとBと呼んでいます。これまでは、AをBの位置に簡単に移動させました.Bの位置を取得し、X座標がAのX座標より大きい場合は、Aの速度をX位置に追加します。 AとYの位置よりもX位置が小さい位置で繰り返す。私はまた、古いものを保存し、いくつかの単純な三角法を使って回転を設定することで、Aの方向を指しています。しかし、今は他のすべてのものが動作しているので、これをもう少し現実的にしたいと思っています。 BがAの左の点からAの右の点に素早く移動するとき、Aの角度および動きは、指している動きから左下に移動することから急速に飛びます。私はスムーズに動かす必要がある。私はAが角度を変えることができる速度を遅くすることを考えていましたが、それは問題を解決しないでしょうし、ちょっとした動きを横取りしてしまいます。私はこれが長い質問であり、私は多くの答えを得られないかもしれないことに気付いています。ありがとう!XNAムーブメント物理学とトラッキング

答えて

2

私はあなたがpredator-prey systemを構築しようとしていると思います。これらは通常微分方程式でモデル化されますが、単純なシミュレーションアルゴリズムはhereです。

0

瞬時にではなく、時間の経過とともにLerping(線形補間)AのBの追跡をお勧めします。実際に直面している位置であるAにVector2を格納し、各フレームに特定の量(B)をハードコードされた角度または一定の割合で指定します。

ここでは、現在の位置を目的の位置に向かって移動するサンプルコードを示します。上記の例では

Vector3 current = Vector3.Zero; 
Vector3 desired = new Vector3(10, 0, -5); 

// For this example we will lerp 75% of the way from 'current' to 'desired' per second 
Vector3 LerpTowardDesired(Vector3 current, Vector3 desired, float timeDelta) 
{ 
    float lerpPercentage = timeDelta * 0.75f; 
    Vector3 newPos = Vector3.Zero; 
    newPos.x = MathHelper.Lerp(current.x, desired.x, lerpPercentage); 
    newPos.y = MathHelper.Lerp(current.y, desired.y, lerpPercentage); 
    newPos.z = MathHelper.Lerp(current.z, desired.z, lerpPercentage); 
} 

あなたは単にtimeDeltaとして秒経過時間を渡し、1フレームに1回LerpTowardDesiredを呼び出します。通知timeDeltaはfloat型であるため、渡される秒数には部分的な秒数が含まれます(例:0.016は1/60秒を表します。したがって、最も近い秒に丸めずに0を渡すことはありません)。

上記で定義したcurrentdesiredのベクトルを使用すると、結果は完璧な60fps(フレーム/秒)を想定して、数フレームの間になります。

// After frame 1 
current = LerpTowardDesired(current, desired, 0.016f); 
// current is now (0.12f, 0.0f, -0.06f) 

// After frame 2 
current = LerpTowardDesired(current, desired, 0.016f); 
// current is now (0.239f, 0.0f, -0.119f) 

// After frame 3 
current = LerpTowardDesired(current, desired, 0.016f); 
// current is now (0.356f, 0.0f, -0.178f) 

あなたが3以上のフレームを見ることができるようにcurrent位置がdesired位置に向かって移動を開始しました。あなたのスプライトが常にcurrentの位置に向くようにするなら、彼は即座にではなく、時間の経過とともにターゲットスプライトを追跡するべきです。

フレームごとにハードコーディングされた角度ではなく、パーセンテージを使用することの最も良い点は、ターゲットが移動する速度が速ければ速いほど、より大きなものと同じパーセンテージになるため、距離。つまり、Aは、どんなに速くてもBに常に追いついていきます。

関連する問題