在AS3中使用QuadTree进行碰撞检测

时间:2013-04-29 12:54:23

标签: java actionscript-3 flex collision-detection flashdevelop

确定。我设法制作并使用QuadTree进行碰撞检测算法,它运行得很好。我有我的敌人并将它们放在QuadTree中,而不是找回可能与我的英雄相撞的候选人。那就是hitTestObject()很多一次。

我遇到的问题是如何快速测试一些敌人是否与我的英雄的子弹发生碰撞。大概我在舞台上同时有4-6发子弹。在这种情况下,我已经针对许多敌人对象击中了TstObject 4-6子弹,这反过来让我循环进入循环,所以即使使用四叉树,一段时间后事情开始滞后于舞台:)

我使用这个教程quadtree in java来开发m alghorithm,但它仅在上述情况下正常工作。在这种情况下我该怎么办?对许多人再使用另一种算法或?

大致这是代码

 bulletsQuadTree.clear();
 for (var bIndex:uint; bIndex < allEnemies.length; bIndex += 1 )        
 {
  bulletsQuadTree.insert(allEnemies[bIndex]);
 }

for (var bc:uint = 0; bc < bullets.length; bc += 1 )
{
    var enemiesCollideBullets:Array = new Array();
    bulletsQuadTree.retrieve(enemiesCollideBullets, bullets[bc]);

    for (var dc:uint = 0; dc < enemiesCollideBullets.length; dc += 1 )
    {
        if (enemiesCollideBullets[dc].hitTestObject(bullets[bc]))
        {
            enemiesCollideBullets[dc].destroy();
            enemiesCollideBullets.splice(dc, 1);
        }
    }
}

所以这发生在每帧上,每帧有很多操作:(

每个子弹都被视为英雄,并且每个可能发生碰撞的子弹都会返回一系列敌人。

1 个答案:

答案 0 :(得分:1)

如果您想提高此循环的性能,请更改以下行:

enemiesCollideBullets[dc].hitTestObject(bullets[bc]);

动作脚本测试功能很慢。更好的子弹方法是检查距离。

var distanceSquared:number = (bullet.width/2 + object.width/2) * (bullet.width/2 + object.width/2);
if((bullet.x - object.x)* (bullet.x - object.x) + (bullet.y - object.y)* (bullet.y - object.y) < distanceSquared) {
// its a hit!