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(或您使用的任何结构),但出于性能问题,您需要尽量减少此列表的元素数量。
如果你给我更多关于游戏环境的细节,也许我可以做代码示例。
我的代码如下所示:
/*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(或您使用的任何结构),但出于性能问题,您需要尽量减少此列表的元素数量。
如果你给我更多关于游戏环境的细节,也许我可以做代码示例。