0

很长一段时间以来,我一直在关注 hitTestObject、hitTestPoint 和自定义 hitTest 的讨论。考虑到形状选项,我通常会沿着使用 Point 的路线走下去。

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

命中测试

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 位置时,这会导致非常非常有限的命中范围。

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

4

3 回答 3

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() 函数。

于 2012-05-15T13:32:29.500 回答
0

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

  1. 使用 hitTestPoint,敌人的命中对象是一个半径增加子弹半径的圆,或者
  2. 通过检查两个对象的中心之间的距离是否大于总和或它们的半径来自己实施命中测试。
于 2012-05-15T12:58:22.420 回答
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,但我认为这是比较清楚的。

于 2012-05-23T17:32:20.263 回答