【问题标题】:Collision detection using QuadTree in AS3在 AS3 中使用 QuadTree 进行碰撞检测
【发布时间】:2013-04-29 12:54:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我宁愿使用 PixelPerfectCollisionDetection。
  • 真正的问题是否有可能是您使用的是 Flex(它不断地使幕后的一堆东西失效,加上所有的数据绑定开销等)?这可能是您在 Flash 中应该做的事情。除此之外,无法根据您发布的内容调试您的代码。
  • 无需调试。问题出在for循环中。每帧的操作太多。所以基本上我认为安倍给出了答案。

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


【解决方案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!

【讨论】:

  • 这比使用 Point.distance 快吗?
猜你喜欢
  • 2011-05-24
  • 2014-07-16
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
相关资源
最近更新 更多