我一直在讨论hitTestObject vs 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位置时,这导致非常非常有限的命中范围。
我的问题是:我怎样才能更准确地做到这一点?
答案 0 :(得分:0)
假设子弹和坏人总是圆形的,你可以......
答案 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,但我认为这是相对清楚的。