【问题标题】:Iterating through large number of objects for collission detection迭代大量对象以进行碰撞检测
【发布时间】:2015-01-03 13:03:56
【问题描述】:

我正在开发一个侧面滚动的无尽奔跑者,主角在收集射击能力时可以向障碍物射击。 我正在使用八哥和动作脚本 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
}      

【问题讨论】:

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


    【解决方案1】:

    优化这一点的一种方法是考虑每颗子弹需要知道哪些障碍物才能击中。如果子弹穿过障碍物,则可以安全地假设它不会与它发生碰撞,因此您不再需要检查该碰撞。

    因此,不是使用嵌套循环检查每个子弹与每个障碍物的碰撞,而是每个子弹在添加到舞台后可以保存一个数组来引用每个障碍物,而这个数组就是您用来检查每个子弹碰撞的数组。一旦子弹的x 距离障碍物足够远以至于它们永远不会碰撞,那么您可以从子弹的障碍物引用数组中删除该障碍物引用。

    通过这种方式,您将遍历一个子弹数组,从每个子弹返回每个障碍物引用数组,然后继续检查这些碰撞。这应该意味着您只需要检查尽可能多的碰撞。

    编辑:

    或者更简单的方法是先遍历子弹,获取它们的x,然后跳过内循环中子弹比障碍物更远的所有障碍物。

    如果您将障碍物反向存储在数组中,那么x 的位置可能是50040020010050 等等,那么子弹越远,它知道它需要检查的越少。如果子弹到达450 的 x 位置,它知道不必检查数组中的其余障碍物,您可以完全跳过数组的其余部分。 p>

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 2010-11-19
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2022-12-30
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多