有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

AS3中基于四叉树的java冲突检测

好的。我成功地制作并使用了四叉树作为碰撞检测算法,效果很好。我有我的敌人,把他们放在四叉树中,然后找到可能与我的英雄相撞的候选人。这就是hitTestObject()多次重复

我遇到的问题是如何快速测试一些敌人是否与我英雄的子弹相撞。我在台上同时大概有4-6发子弹。在这种情况下,我用hitTstObject 4-6发子弹攻击许多敌人的物体,这反过来又让我以循环为周期,所以即使使用四叉树,过了一段时间,事情也开始滞后于舞台:)

我使用本教程quadtree in java来开发m算法,但它仅在上述情况下工作良好。在这种情况下我该怎么办?使用另一种算法处理多个或多个

大致上这就是代码

 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) 个答案

  1. # 1 楼答案

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

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

    actionscript命中测试功能很慢。检查子弹的更好方法是检查距离

    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!