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

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

好的。我设法为我的碰撞检测算法制作并使用了 QuadTree,它工作得很好。我有我的敌人并将他们放在四叉树中,而不是检索可能与我的英雄发生冲突的候选人。这是 hitTestObject() 的多次重复。

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

我使用了本教程 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);
        }
    }
}

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

每颗子弹都被视为英雄,每颗子弹都可能会与之发生碰撞,并返回一组敌人。

最佳答案

如果你想提高这个循环的性能,改变这一行:

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

actionscript HitTest 功能很慢。一个更好的子弹方法是检查距离。

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!

关于java - 在 AS3 中使用 QuadTree 进行碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16279151/

相关文章:

java - 如何验证字符串是否包含列表中的任何字符串?

回调中的 Java 数组数据损坏

java - 如何从flex向java套接字服务器发送AMF格式的数据?

java fx 8 可以替代 flex

apache-flex - 数字步进小数的奇怪行为

java - 谁能解释一下下面的命令吗?

java - Android - 无法以编程方式删除 Wifi 网络 - WifiManager 类型中的方法 removeNetwork(int) 不适用于参数(字符串)

actionscript-3 - AS3 - 允许在输入文本中使用正斜杠吗?

apache-flex - AS3 : How to convert ascii code to character actionscript

web-services - Flex webservice 巨大的性能问题