好的。我设法为我的碰撞检测算法制作并使用了QuadTree,它工作得很好。我有我的敌人,并将他们放在QuadTree中,然后检索可能与我的英雄发生冲突的候选人。这就是hitTestObject()多对一。
我遇到的问题是如何快速测试一些敌人是否与我的英雄的子弹相撞。大概有4-6颗子弹同时出现在舞台上。在这种情况下,我有4-6颗hitTstObject子弹对准许多敌人物体,这反过来给了我循环循环,所以即使在一段时间后使用四叉树,事情也会在舞台上开始滞后:)
我使用了这个教程quadtree in java来开发算法,但它只在上面的情况下工作得很好。在这种情况下我应该怎么做?使用另一种算法进行多次重复还是多次?
大致代码是这样的:
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);
}
}
}
所以这发生在每一帧上,每一帧有许多操作:(
每一颗子弹都被视为英雄,每一颗可能发生碰撞的子弹都会返回一组敌人。
发布于 2013-04-30 01:12:43
如果您想要提高此循环的性能,请更改以下行:
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!
https://stackoverflow.com/questions/16279151
复制相似问题