私は作っているゲームを持っています。私は2つのスプライトを持っており、AとBと呼んでいます。これまでは、AをBの位置に簡単に移動させました.Bの位置を取得し、X座標がAのX座標より大きい場合は、Aの速度をX位置に追加します。 AとYの位置よりもX位置が小さい位置で繰り返す。私はまた、古いものを保存し、いくつかの単純な三角法を使って回転を設定することで、Aの方向を指しています。しかし、今は他のすべてのものが動作しているので、これをもう少し現実的にしたいと思っています。 BがAの左の点からAの右の点に素早く移動するとき、Aの角度および動きは、指している動きから左下に移動することから急速に飛びます。私はスムーズに動かす必要がある。私はAが角度を変えることができる速度を遅くすることを考えていましたが、それは問題を解決しないでしょうし、ちょっとした動きを横取りしてしまいます。私はこれが長い質問であり、私は多くの答えを得られないかもしれないことに気付いています。ありがとう!XNAムーブメント物理学とトラッキング
0
A
答えて
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を渡すことはありません)。
上記で定義したcurrent
とdesired
のベクトルを使用すると、結果は完璧な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
に常に追いついていきます。
関連する問題
- 1. XNA水物理学
- 2. XNA/Monogame:プラットジャンプ物理学と衝突問題
- 3. Xnaベクトルと物理シミュレーション
- 4. バスケットボール物理学衝突検出とバウンス物理
- 5. クリケット物理学、基本シミュレーション
- 6. 物理学にHaskellで
- 7. Bukkit EntityExplode物理学とブロックの再生
- 8. タイルマップ2D現実的流体物理学
- 9. スウィフト4変更物理学重力
- 10. 弾丸物理学Broadphase複合体
- 11. スウィフト作成物理学のジョイント
- 12. 3D卓球物理学の部分?
- 13. iPhoneゲーム "Paper Toss"プログラミング物理学
- 14. Android用ベスト2dゲームエンジン[物理学]
- 15. 計算物理学、FFT解析
- 16. 弾丸物理学MultiSphereShapeの使用
- 17. ゲーミングアプリケーションのための物理学電磁気学のシミュレーション
- 18. XNAのフォトショップブレンドの数学
- 19. HTML5キャンバス - ボール物理学との衝突グリッチ
- 20. "障害物"オブジェクトを移動する方法。コロナSDK物理ボックス2D。物理学の更新?
- 21. XNAのリソースとコンテンツ管理
- 22. Javaゲーム、バウンス&ムーブメント
- 23. C#XNAムーブメント - 両方を回すことも移動することもできません。
- 24. 私は、C#/ XNAで物理エンジンを作っていますC#/ XNAで衝突検出のための
- 25. 論理ファイルシステムと物理ファイルシステム
- 26. 決定木学習と不純物
- 27. 物理定数と数学定数のライブラリと基本変換をC#.net
- 28. マルチプレイヤーゲームで物理学を同期する方法は?
- 29. 毎回異なる結果を出すSpriteKitの物理学
- 30. Spritekit - 物理学のボディにアクセラレーションを適用する