1

XNAで2Dゲームを作成していますが、NPCスプライトはすべて1つのマスにグループ化されており、1つのスプライトのように見えます。これを回避する方法は、すべてのスプライトで衝突検出を行い、それらを互いに離すだけだと思いましたが、それはフレームで何百ものチェックを行うことを意味しました。

次に、ゲームウィンドウをに分割しgrid (6*6)、各スプライトを36の配列のいずれかに配置することにしました。そのため、同じ象限内の各スプライトに対して各スプライトをチェックするだけで済みます。位置をチェックしているので、これが私の問題になりました。これはVector2、関連するグリッドの正方形にすべてを配置する方法がわかりません。

どこか不明な点がありましたらお知らせください。改善に努めます。

4

2 に答える 2

3

これは確かに最も最適化された方法ではありませんが、次の方法が簡単な方法になる可能性があります。Felix K. の回答は、よりパフォーマンスの高いソリューションを提供する可能性があります。グリッド内の同じ位置を共有する複数の要素が必要な場合は、グリッドのタイプを から に変更Vector2するVector2[]か、最も便利と思われるコレクション タイプに変更して、サンプルを微調整できます。

//Size of each square
const int squareSize = 10;
const int gridSquares = 6;
var grid = new Vector2[gridSquares,gridSquares];
//Sample vectors
Vector2[] vectors =
    {
        new Vector2(0, 0),
        new Vector2(25, 0),
        new Vector2(20, 40),
        new Vector2(59, 59)
    };
foreach (var vector in vectors)
{
    var x = vector.X/squareSize;
    var y = vector.Y/squareSize;
    grid[x, y] = vector;
}
于 2012-12-30T16:17:14.233 に答える
1

最初: Box2dを使用しないのはなぜですか? 使用したくない場合は、quad-tree を探すことができますゲーム用の quad-tree の優れた実装がいくつかあります。通常のものよりも高速な完全に展開された四分木を好みますが、オンラインでそれに関する記事を見つけることができません。メールボックスにこれに関するスキャン記事がありますが、ここには投稿しません。

基本的に、これを実行して、クワッド ツリー内の関連するノードを確認できます。

  • オブジェクトがルート ノード内に収まるかどうかを確認します (そうでない場合、オブジェクトは最上位ノードにあります)。
  • オブジェクトがそれらの 1 つに収まるかどうか、4 つのサブノードを確認します。オブジェクトがどのサブノードにも収まらなくなるまでこれを処理してから、現在のノードに追加します。
  • シーンを処理するときに、実際のオブジェクトを含むノードを見つけて (それを含むオブジェクトに保存します)、ルートに到達するまで親ノードまで歩いて、それぞれの衝突をチェックします。
  • 四分木の
于 2012-12-30T16:08:47.593 に答える