2

私はBeat'emUpゲーム用の2Dエンジンを作成中です(CastleCrashersは私がBeat'emUpまたはBrawlerの種類のゲームと呼んでいるものです)。

2Dスプライトと2Dパーティクルエミッターをサポートします。これはすべてエンジンで実行されます。しかし、私はアドバイスを求めたい問題に直面しました:

それは「スペース」管理についてです。この画像が示すように、私が考えたのは何かをすることでした。

代替テキストhttp://img337.imageshack.us/img337/9162/spacingprototype1.png

私のアイデアは、パーティクルエミッター/ 2Dスプライトが存在する地面のグリッド(空間ハッシュまたはグリッド)を作成することです。私の写真では、このスロットを1からNまで列挙しています(35である必要はありません。これは、目的を示すためだけのものです)。私の考えは、「GameElements」(スプライト/エミッター)を0からNの順に(バケット0からバケットNに向かって)描画することです。これにより、画面上で正しくオーバーラップして表示されるようになります(戻るから進む)。

これは、各要素の下側のY軸を比較して「クイックソート」を実行するだけで実行できることはわかっていますが、グリッドを使用すると、より良い方法で衝突検出を実行できます。また、A*のようなものを実行すると実装できます。ある種のAI、それは私にも役立つかもしれません。

4

3 に答える 3

5

相互にテストする必要のあるオブジェクトの数をある程度最適化したい場合は、Quadtreehttp ://en.wikipedia.org/wiki/Quadtreeの使用を検討することをお勧めします。

アイデアは、画面を4つのノードに分割し、それらが属するノードにすべてのアイテムを配置し、テストする必要のあるスプライト/アイテム/その他のものがある場合は、作成したノードを別の4つに分割することです。ノード内のアイテムの特定のサイズまたは量に達するまで、これを繰り返します。

次に、テストする項目が含まれているかどうかをトップノードに確認できます。次に、このノードは子ノードにアイテムが含まれているかどうかを尋ね、次に子ノードは子に尋ねます。このようにして、画面の大部分をすでにスキップできます(子00にある場合は、子01、10、および11をスキップできます)。次に、必要に応じて、より具体的な衝突検出を実行するアイテムのリストを取得します。

視覚的にすると、次のようになります。

代替テキストhttp://geodata.ethz.ch/geovite/tutorials/L2GeodataStructuresAndDataModels/en/images/quadtree.gif

于 2009-11-02T11:55:12.500 に答える
1

それらをZバッファーに向けて発射し、心配させてください。

将来、(明らかにプロファイリングを介して)遅すぎることがわかった場合は、最適化を検討してください。

最も単純な解決策を取り、次に進みます。

于 2009-11-02T11:58:53.797 に答える
1

グリッド内の同じボックスを2つのスプライトが占有している場合、メソッドは失敗します。同じボックスに2人の敵が立っているとします。一方はもう一方の少し前に立っています。どちらを最初に描きますか?2つのアルゴリズムが必要になります。1つはスプライトをグリッドに分割し、もう1つは特定のグリッドボックス内のすべてのスプライトのz座標を調べ、その値に基づいてそれらを描画します。

はるかに簡単な方法は、すべてのスプライトの単一のコレクションを作成することです。z座標でソートされたすべてのスプライトを格納する必要があります(リストの先頭にある画面の背面から背面にある画面の前面まで)。コレクションをループして、表示される各スプライトを描画します。スプライトが画面に出入りするとき(つまり、そのz座標が変化するとき)、コレクション内でその単一のスプライトを移動するための非常に簡単な並べ替えを実行できます。次のスプライトのz座標が、変更されたスプライトの座標よりも大きい/小さい(必要に応じて)になるまで、リスト内の次のスプライトと交換し続けます。

于 2009-11-02T12:17:51.120 に答える