如何将瓷砖地图转换为一堆边界框?

时间:2012-08-05 09:43:09

标签: c# xna bounding-box

我正在尝试与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)进行交叉但是会有很多边界框(可能是它们的2d数组?这可能吗?)而且我已经尝试了几次但是我搞砸了。

我用来绘制的代码与链接中的代码非常相似。我已经尝试创建一个boundingbox数组并为它们设置一个边界框,因为我知道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);
    }
}

我很高兴知道是否有其他方法可以做到这一点,或者我的想法是不正确的。

1 个答案:

答案 0 :(得分: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”的正方形时,您可能最好进行检查 - 然后相应地调整/取消移动。