Actionscript 3 遍历大量对象以进行碰撞检测

Actionscript 3 遍历大量对象以进行碰撞检测,actionscript-3,air,flash-cs5,starling-framework,Actionscript 3,Air,Flash Cs5,Starling Framework,我正在开发一个侧面滚动的无止境的跑步者,其中主角可以在收集射击能力时向障碍物开火。 我正在使用八哥和动作脚本3。我的目标是每秒60帧 为了处理子弹和障碍物之间的碰撞,我将屏幕上的所有子弹存储在一个数组中,并遍历每个子弹,然后对屏幕上的所有障碍物进行碰撞测试 现在如果屏幕上有30颗子弹,假设有8个障碍物,那么测试的数量将达到30*8=240 我认为这太过分了 你能给我推荐一个优雅的(更快的)方法吗?还有一件事我做了碰撞测试,像这样告诉我是否有更好的方法 var object_1_rect : Re

我正在开发一个侧面滚动的无止境的跑步者,其中主角可以在收集射击能力时向障碍物开火。 我正在使用八哥和动作脚本3。我的目标是每秒60帧

为了处理子弹和障碍物之间的碰撞,我将屏幕上的所有子弹存储在一个数组中,并遍历每个子弹,然后对屏幕上的所有障碍物进行碰撞测试

现在如果屏幕上有30颗子弹,假设有8个障碍物,那么测试的数量将达到30*8=240 我认为这太过分了

你能给我推荐一个优雅的(更快的)方法吗?还有一件事我做了碰撞测试,像这样告诉我是否有更好的方法

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
距离障碍物足够远,它们将永远不会碰撞,则可以从子弹的障碍物参照数组中删除该障碍物参照

通过这种方式,您可以循环遍历一组项目符号,返回每个项目符号的每个障碍物引用数组,然后继续检查这些碰撞。这意味着您只需要检查所需数量的碰撞

编辑:

或者更简单的方法是先在子弹之间循环,得到它们的
x
,然后跳过内循环中子弹距离障碍物更远的每个障碍物

如果将障碍物向后存储在阵列中,则
x
位置可能是
500
400
200
100
50
等等,那么子弹越远,它知道需要检查的就越少。如果子弹到达x位置
450
,它知道它不必检查阵列中的其余障碍物,您可以完全跳过阵列的其余部分