1

現在、XNA でプラットフォーム ゲームを作成しています。私のコリジョン テストは現在、foreach ループを実行して、すべてのタイルのバウンディング ボックスでプレーヤーのバウンディング ボックスをテストすることによって動作します。ただし、プレイヤーがブロックに触れていないかどうかをテストする方法がわかりません。

アレイを実行して、プレイヤーがブロックに触れていないかどうかをテストして、プレイヤーが空中にいるかどうかを確認するにはどうすればよいですか? ヘルプやアドバイスをいただければ幸いです。前もって感謝します!

///////////////////////////////////

私の衝突コードは

    if (personRectangle.TouchTopOf(newRectangle))
    {
         onGround = true;
         test = false;
         test2 = true;
    }

対応するブールテストは

    public static bool TouchTopOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Bottom >= r2.Top - 1 &&
                r1.Bottom <= r2.Top + (r2.Height / 2) &&
                r1.Right >= r2.Left + (r2.Width / 5) &&
                r1.Left <= r2.Right - (r2.Width / 5));
    }

そして、このコードは、Game1.cs の更新で衝突をテストします。

        foreach (CollisionTiles tile in map.CollisionTiles)
            player.Collision(tile.Rectangle);

私のマップクラスのタイルのリストはどれですか

    private List<CollisionTiles> collisionTiles = new List<CollisionTiles>();
4

2 に答える 2

3

XNA Rectangles には組み込みの intersects メソッドがあります。

if (rect1.Intersects(rect2)){
...
}

タイルの四角形をループして、それぞれで交差を呼び出すだけです。より効率的にするには、プレイヤー座標をワールド座標にマッピングし、プレイヤーに最も近いタイルを決定する必要があります。これにより、ループする必要があるタイルの数を絞り込むことができます。

編集:明確にするために、次のことができます:

bool collision=false;
foreach (CollisionTiles tile in map.CollisionTiles) {
    if(personRectangle.Intersects(tile.Rectangle)) {
        collision =true;
        break;
    }
}

そして、collision が true の場合、どこかで衝突があったことがわかります。

于 2013-02-27T17:21:16.387 に答える
0

断る理由がない限り、簡潔にまとめてください。衝突したものの数を追跡してください。カウントが 0 になった場合は、何も衝突していません。

あなたが持っているコードの変更/最適化について心配することなく、それは次のようなものかもしれません:

int touchedCount = 0;
foreach (CollisionTiles tile in map.CollisionTiles)
{
        if (player.Collision(tile.Rectangle))
        {
             touchedCount++;
        }
}

if (touchedCount == 0)
{
    //You did not collide with anything
}

次に、衝突メソッド内で同様のことを行い、チェックを追跡し、衝突したかどうかを追跡します。他の回答が示唆するように、これはおそらく Rectangle.Intersects を使用するのが最も簡単でしょう。

于 2013-02-27T18:55:17.537 に答える