1

我正在尝试使用 xna 进行碰撞检测。我有一个(某种)平台游戏地图,我从二维数组中绘制了一张地图,如下所示:

  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)用于交集,但会有很多边界框(可能是它们的二维数组?这可能吗?)我已经尝试了几次但我搞砸了。

我用来绘制的代码与链接中的代码非常相似。我试图制作一个边界框数组并为它们设置一个边界框,因为我知道 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

首先,我会尝试在没有 Draw() 调用的情况下没有任何游戏逻辑,因为当 XNA 检测到游戏运行缓慢时,它将忽略 Draw(),直到 Update() 调用赶上。

对您来说,这样做的明显缺点是,如果由于某种原因游戏运行缓慢(即用户的硬件不好),甚至不会发生碰撞检测!明显不好=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 回答