【问题标题】:How can I turn a tile map to bunch of bounding boxes?如何将平铺地图变成一堆边界框?
【发布时间】:2012-08-02 15:56:49
【问题描述】:

我正在尝试使用 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);
    }
}

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

【问题讨论】:

    标签: c# xna bounding-box


    【解决方案1】:

    首先,我会尝试在没有 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”的方格时,您可能会更好地进行检查 - 然后相应地调整/取消移动。

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多