迭代大量对象进行碰撞检测

时间:2015-01-03 13:03:57

标签: actionscript-3 air flash-cs5 starling-framework

我正在开发一个侧面滚动无尽的跑步者,主角可以在收集射击能力时射击障碍物。 我正在使用starling和动作脚本3.我的目标是60 fps。

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

现在,如果我在屏幕上有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
}      

1 个答案:

答案 0 :(得分:2)

你可以优化这一点的一种方法是考虑每个子弹需要知道它会遇到什么障碍。如果子弹已经越过障碍物,则可以安全地假设它不会与它发生碰撞,因此您不再需要检查碰撞。

因此,不是嵌套循环检查每个子弹对抗每个障碍物,每个子弹可以保持一个阵列引用每个障碍物一旦它被添加到舞台上,这个阵列就是你用来检查每个子弹的碰撞。一旦子弹x距离障碍物足够远,它们永远不会碰撞,那么你可以从子弹的障碍物参考阵列中移除该障碍物参考。

通过这种方式,您可以循环遍历子弹阵列,返回每个子弹中的每个障碍物参考阵列,然后继续检查这些碰撞。这应该意味着您只需要根据需要检查尽可能多的碰撞。

修改

或者甚至更简单的方法是首先循环子弹,获得他们的x,然后跳过子弹远离障碍物的内环中的每个障碍物。

如果您将障碍物向后存储在阵列中,那么x位置可以是500400200100,{{1等等,然后子弹得到的越多,它知道它需要检查的越少。如果子弹到达50的x位置,知道它不必检查阵列中的其余障碍物,您可以跳过阵列的其余部分完全。