AS3:hitTestObject vs hitTestPoint for Bullet vs Enemy

时间:2012-05-15 12:53:06

标签: actionscript-3 flash actionscript

我一直在讨论hitTestObject vs hitTestPoint与自定义hitTest的讨论已有一段时间了。在给定形状选项的情况下,我经常走下使用Point的路线。

但是 - 我现在正试图对子弹击中一个圆形敌人进行命中测试。我目前使用的是:

hit test

for (var i:int = 0; i<levelHolder.enemyArray.length; i++){
            if(levelHolder.enemyArray[i]){
                if(this.hitTestObject(levelHolder.enemyArray[i].hit) && hit == false && distanceTravel <= range){
                    trace("You hit a baddie "+i)
                    hit = true
                    this.parent.removeChild(this)
                    var gotShot:gotshot = new gotshot() // move to sound
                    gotShot.play()                      // move to sound
                    levelHolder.damageEnemy(i, damage)
                } 
            }   
        }

现在,显然这会导致子弹停在命中周围的alpha区域并将其视为命中。

我确实假设我能够轻松地执行以下操作,但它不起作用:

if(this.hitTestPoint(levelHolder.enemyArray[i].x, levelHolder.enemyArray[i].y, true) && hit == false && distanceTravel <= range)
...

当我们处理单个X和Y位置时,这导致非常非常有限的命中范围。

我的问题是:我怎样才能更准确地做到这一点?

3 个答案:

答案 0 :(得分:0)

假设子弹和坏人总是圆形的,你可以......

  1. 使用hitTestPoint,敌人的命中对象是一个圆,其半径增加了子弹的半径,或者
  2. 通过检查两个物体的中心之间的距离是否大于总和或它们的半径来自己实施命中测试。

答案 1 :(得分:0)

首先注意到的是,如果你谈论性能,下面的代码就失败了。对其进行单一更改将获得%90

等性能
if(this.hitTestObject(levelHolder.enemyArray[i].hit) && hit == false && distanceTravel <= range)
// this way is much better.
if( hit == false && distanceTravel <= range && this.hitTestObject(levelHolder.enemyArray[i].hit))

如果您正在使用圈子,则第二件事就是实施您自己的热门测试,如@Russel所说。并尽量不要使用Math.sqrt()函数。

答案 2 :(得分:0)

可以使用类似的东西轻松完成两个圆形物体的击中测试。

var dx:Number = a.centerX - b.centerX;
var dy:Number = a.centerY - b.centerY;
var dLimit = a.radius + b.radius;
return Square(dx) + Square(dy) <= Square(dLimit);

对不起,如果有点Psudocode,但我认为这是相对清楚的。