1

xnaとの衝突検出を行おうとしています。次のような2D配列からマップを描画する(一種の)プラットフォーマーマップがあります。

  int[,] map = new int[,] 
{
{0,0,1,0,0,0,0,0,},
{0,0,1,1,0,0,0,0,},
{0,0,0,1,1,0,0,0,},
{0,0,0,0,1,0,0,0,},
{0,0,0,1,1,0,0,0,},
{0,0,1,1,0,0,0,0,},
{0,0,1,0,0,0,0,0,},
{0,0,1,1,1,1,1,1,},
};

http://xnatd.blogspot.com/2009/02/ok-so-first-part-of-our-tower-defence.htmlから取得したので、実際のものではありませんが、類似しています。また、バウンディングボックスが問題なくある横スクロールのようなメインキャラクターのクラスもあります。

ただし、タイルセットのバウンディングボックスを取得して、mario.boundingboxがそれらと交差するかどうかを確認するにはどうすればよいですか?

交差点に使用できることは知っていますboundingbox.intersects(boundingbox2)が、多くのバウンディングボックスがあり(おそらくそれらの2次元配列ですか?これは可能ですか?)、何度か試しましたが、めちゃくちゃになりました。

私が描くために使用するコードは、リンクにあるコードと非常によく似ています。x、yとサイズの両方を知っているので、バウンディングボックス配列を作成し、それらのバウンディングボックスを設定しようとしましたが、ランダムな場所にバウンディングボックスを作成することになりました。

このコード内にバウンディングボックスを作成して後で使用するにはどうすればよいかを知る必要があると思います(xとyごとにループして何かが触れるかどうかを確認しますか?):

for (int x = 0; x < Width; x++)
{
    for (int y = 0; y < Height; y++)
    {
        int textureIndex = map[y, x];
        if (textureIndex == -1)
            continue;

        Texture2D texture = tileTextures[textureIndex];
        batch.Draw(texture, new Rectangle(
            x * 32, y * 32, 32, 32), Color.White);
    }
}

これを行う別の方法があるかどうか、または私の考えが間違っているかどうかを知ってうれしいです。

4

1 に答える 1

0

まず、XNA がゲームの実行速度が遅いことを検出すると、Update() 呼び出しが追いつくまで Draw() を無視するため、Draw() 呼び出しなしでゲーム ロジックを持たないようにします。

これの明らかな欠点は、何らかの理由でゲームの実行が遅い場合 (つまり、ユーザーのハードウェアが悪い場合)、衝突検出さえ行われないことです! 明らかに良くない = P

一般的なアプローチは、配列/グリッドに関してプレイヤーの位置を取得し、配列の周囲の正方形をループして、そのスペースに 1 があるかどうかを確認し、ある場合は、そのための衝突長方形を作成することです。プレーヤーと交差するかどうかを確認します。私はあなたのためにいくつかのコードを書いてみます:

for (int i = player.X - 1; i < player.X + 2; i++) // Check in a 3x3 square with player in middle
{
    for (int j = player.Y - 1; j < player.Y + 2; j++)
    {
        if (map[i, j] == 1)
        {
            // Make rectangle, check for collision, do logic if there is one
        }
    }
}

更新ブロックでこれが必要になるでしょう。また、i と j がグリッドの範囲外に出ないようにする必要もあります。

編集:

考えてみると、すべての更新呼び出しですべての長方形を再作成するのは、おそらく悪い考えです。プレーヤーが移動しようとしたときに、配列に「1」がある正方形に足を踏み入れようとしているかどうかを確認し、それに応じて移動を調整/キャンセルすることをお勧めします。

于 2012-08-05T14:16:47.717 に答える