迭代大量对象以进行碰撞检测
Iterating through large number of objects for collission detection
我正在开发一款横版无尽跑酷游戏,主角收集到射击能力后可以向障碍物射击。
我正在使用八哥和动作脚本 3。我的目标是 60 fps。
为了处理子弹和障碍物之间的碰撞,我将屏幕上的所有子弹存储在一个数组中,并遍历每颗子弹,并对屏幕上存在的所有障碍物进行碰撞测试
现在,如果我在屏幕上有 30 颗子弹,假设有 8 个障碍物,那么测试次数将变为 30 * 8 = 240
我认为它有点矫枉过正
你能建议我一个优雅(更快)的方法吗that.And我再做一件事像这样的碰撞测试告诉我是否有更好的方法
var object_1_rect : Rectangle = object1.getBounds(this);
var object_2_rect : Rectangle = object2.getBounds(this);
if (object_1rect.intersects(object_2_rect))
{
//they are colliding
}
您可以优化它的一种方法是考虑每颗子弹需要知道哪些障碍物才能击中。如果子弹已经越过障碍物,则可以安全地假设它不会与其发生碰撞,因此您不再需要检查该碰撞。
因此,不是嵌套循环检查每颗子弹与每一个障碍物的关系,而是每颗子弹在添加到舞台后都可以保存一个引用每个障碍物的数组,而这个数组就是您用来检查与每颗子弹的碰撞的数组。一旦子弹的 x
距离障碍物足够远,它们永远不会发生碰撞,那么您可以从子弹的障碍物引用数组中删除该障碍物引用。
通过这种方式,您将遍历一个子弹数组,return 每个子弹数组的每个障碍物引用,然后继续检查这些碰撞。这应该意味着您只检查所需数量的碰撞。
编辑:
或者更简单的方法是先遍历子弹,得到它们的 x
,然后在子弹比障碍物更远的内循环中跳过每个障碍物。
如果将障碍物倒序存储,那么x
的位置可能是500
、400
、200
、100
、50
等等,然后子弹越远,它知道需要检查的就越少。如果子弹到达450
的x位置,它知道它不必检查数组中其余的障碍物,可以跳过其余的完全排列。
我正在开发一款横版无尽跑酷游戏,主角收集到射击能力后可以向障碍物射击。 我正在使用八哥和动作脚本 3。我的目标是 60 fps。
为了处理子弹和障碍物之间的碰撞,我将屏幕上的所有子弹存储在一个数组中,并遍历每颗子弹,并对屏幕上存在的所有障碍物进行碰撞测试
现在,如果我在屏幕上有 30 颗子弹,假设有 8 个障碍物,那么测试次数将变为 30 * 8 = 240 我认为它有点矫枉过正
你能建议我一个优雅(更快)的方法吗that.And我再做一件事像这样的碰撞测试告诉我是否有更好的方法
var object_1_rect : Rectangle = object1.getBounds(this);
var object_2_rect : Rectangle = object2.getBounds(this);
if (object_1rect.intersects(object_2_rect))
{
//they are colliding
}
您可以优化它的一种方法是考虑每颗子弹需要知道哪些障碍物才能击中。如果子弹已经越过障碍物,则可以安全地假设它不会与其发生碰撞,因此您不再需要检查该碰撞。
因此,不是嵌套循环检查每颗子弹与每一个障碍物的关系,而是每颗子弹在添加到舞台后都可以保存一个引用每个障碍物的数组,而这个数组就是您用来检查与每颗子弹的碰撞的数组。一旦子弹的 x
距离障碍物足够远,它们永远不会发生碰撞,那么您可以从子弹的障碍物引用数组中删除该障碍物引用。
通过这种方式,您将遍历一个子弹数组,return 每个子弹数组的每个障碍物引用,然后继续检查这些碰撞。这应该意味着您只检查所需数量的碰撞。
编辑:
或者更简单的方法是先遍历子弹,得到它们的 x
,然后在子弹比障碍物更远的内循环中跳过每个障碍物。
如果将障碍物倒序存储,那么x
的位置可能是500
、400
、200
、100
、50
等等,然后子弹越远,它知道需要检查的就越少。如果子弹到达450
的x位置,它知道它不必检查数组中其余的障碍物,可以跳过其余的完全排列。