从泛型列表中测试边界框
本文关键字:边界 测试 泛型 列表 | 更新日期: 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));
}