从泛型列表中测试边界框

本文关键字:边界 测试 泛型 列表 | 更新日期: 2023-09-27 18:35:39

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

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" 。我认为我的列表有问题,但是如果我将我的英雄与列表中的最后一个边界框碰撞,那么它就会很好地工作;对于任何其他边界框,它不会。

从泛型列表中测试边界框

如果你找到一个相交的盒子,你需要打破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"

当你发现碰撞时,你不会离开循环,并且每次在循环中都会覆盖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));
}