3

私が作っているゲームで、給油ステーションの上部にぶつかったときにそれを検出したい移動中の火星着陸船があります。彼らがいつヒットしたかを正確に知るための最良の方法を知りたいです。

私が現在行っていることは、水平、垂直、重力の動きを制御する 3 つのタイマーがあることです。各タイマーは火星着陸船を少し動かすので、クラッシュ検出コードをそれぞれの上部と下部に配置しましたが、それぞれが 50 ミリ秒ごとに起動するため、a) 衝突を正確に検出せず、b) を呼び出します。クラッシュ検出コードを何度も。

これはタイマーの 1 つがどのように見えるかであり、3 つすべてでほとんど同じです (私は vb 2008 でゲームを作成しています。これは単なる擬似コードです)。

gravity timer:
    detectCrash()
    Move ship 
    detectCrash()
End timer
  1. 衝突からそれが呼び出すコードまでの応答時間に関して、それらが衝突しているかどうかを確認するより正確な方法は何でしょうか。

  2. 検出をより少ない回数で呼び出すにはどうすればよいですか?

10ミリ秒ごとに起動する別のタイマーを作成して衝突をチェックすることもできますが、これによりコードが非常に多く(1秒間に100回)実行されますか?

大規模なゲームがこのようなことをどのように処理するかについても興味があります.これはおそらく1秒間に何度も発生します.

ありがとう。

4

2 に答える 2

2

できることの 1 つは、1 つのタイマーを使用してすべての動きを 16 または 17 ミリ秒 (約 60 fps) で制御することですが、それでも速すぎる場合があります。おそらく 40 ミリ秒 (25 fps) で問題ないはずです。このタイマー イベントでは、移動する前にオブジェクトの新しい位置を計算し、新しい位置で衝突が発生するかどうかを確認し、そうでない場合はオブジェクトを移動します。

少なくとも、それが vb.net で行う方法です。ただし、おそらくXNAを使用します。

于 2012-07-27T13:01:48.460 に答える
1

オブジェクトの移動と衝突の検出に別々のタイマーを使用する必要はありません。このアプローチには、いくつかの明らかな問題があります。

  • まったくスケーリングしません。さらにオブジェクトを追加することを想像してください。それぞれに 2 つのタイマーがありますか (X 平面と Y 平面にそれぞれ 1 つ)? 各オブジェクトの衝突を検出する別のタイマーを追加しますか?
  • タイマーが同期しなくなる可能性があります。たとえば、X 平面で船を動かすコードは、Y 平面のコードよりも実行に時間がかかると想像してください。突然、あなたの船は水平に動くよりも垂直に動くことが多くなります。

「本物の」ゲームには単一のループがあり、ほとんどの問題が解消されます。擬似コード:

  1. ユーザー入力のチェック
  2. 船の新しい X および Y 位置を計算する
  3. 衝突のチェック
  4. 結果を画面に描画する
  5. 五島一

明らかに、単純なゲーム以上のものがあります。しかし、これは、進行中のすべてに対して個別のループを作成しようとするのではなく、必要なアプローチです。

于 2012-07-27T12:55:57.700 に答える