1

我想测试两个BoundingBoxes 是否相交。我有一个清单:

List<BoundingBox> Mapa_BB = new List<BoundingBox>();

然后我将边界框添加到这个列表中,效果很好——我通过将其更改为字符串然后绘制它来测试它——所以我确定它们存在。BoundingBox hero;是我的英雄的边界框。

接下来,我做了一个函数来测试是否发生碰撞:

public void Collision()
{
    foreach (BoundingBox BB_map in Map_BB)
    {
        if (hero.Intersects(BB_map))
        { test = "true"; }
        else
        { test = "false"; }
    }
}

如您所见,如果发生冲突,我想将字符串变量设置test"true"; 如果没有,到"false"。我会认为我的列表有问题,但如果我的英雄与列表中的最后一个边界框发生碰撞,那么它运行良好;对于任何其他边界框,它不会。

4

2 回答 2

2

如果你发现一个相交的盒子,你需要打破foreach循环:

public void Colision()
{
    foreach (BoundingBox BB_map in Map_BB)
    {
        if (hero.Intersects(BB_map))
        {
            test = "true";
            break;
        }
        else
            test = "false";
    }
}

如果没有break;,以下不匹配的框将设置test"false"

于 2013-10-15T13:59:29.200 回答
2

当你发现一个碰撞时你不会离开循环,并且你test每次都覆盖循环,所以唯一实际应用的测试(正如你已经注意到的)是最后一个。

除此之外,正确的方法是返回一个布尔值,而不是使用表示布尔值的全局字符串。这也解决了你的问题。所以:

public bool Collision() {
    foreach (BoundingBox BB_map in Map_BB) {
        if (hero.Intersects(BB_map)) {
            return true;
        }
    }

    return false;
}

也可以写成:

public bool Collision() {
    return Map_BB.Any(bb => hero.Intersects(bb));
}
于 2013-10-15T14:06:43.230 回答