XNA(Monogame)我需要一条碰撞的捷径

XNA (Monogame) I need a short way for collisions

我的代码如下所示:

 /*Need  help here*/ 
if (car1.hitbox.Intersects(parkingLoot[0].hitbox) || car1.hitbox.Intersects(parkingLoot[1].hitbox))
        intersects = true;
    else
        intersects = false;

其中 hitboxes 是一个矩形。 如您所见,数组中有 2 个 parkingLoot 对象,我检查了它们。但是如果我有 1000 parkingLoot 个对象呢? 我不想使用 "for loop" 检查每个 parkingLoot 对象 hitbox 是否与汽车相交。

如何检测 car1.hitbox 是否与属于 PARKINGLOOT 对象

的任何 HITBOX 对象相交

您可以使用 System.Linq 扩展在没有 foreach 的情况下迭代集合,如下所示:

var intersects = parkingLoot.Any(_ => car1.hitbox.Intersects(_.hitbox));

或者您可以使用 System.Threading.Tasks 中的 Parallel.ForEach 并行迭代列表中的项目。

我不知道你的场景环境,但在我的例子中,我有一个开放的世界,我在地图中使用了一个网格,对象被放置在网格的单元格周围。你可以做类似的事情,将每个 parkingLoot 障碍物放在一个网格中,然后你的车。然后,使用您汽车的尺寸,您可以知道汽车占用的单元格集,并检查这些单元格以查看是否存在障碍物,并检查这些障碍物碰撞矩形子集的碰撞。

您总是需要为一组障碍执行 for(或您使用的任何结构),但出于性能问题,您需要尽量减少此列表的元素数量。

如果你给我更多关于游戏环境的细节,也许我可以做代码示例。