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)
                } 
            }   
        }

さて、明らかにこれにより、弾丸はヒットの周りのアルファ領域で停止し、ヒットとしてカウントされます。

私は次のことを簡単に実行できると思いましたが、機能しません。

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

これにより、単一のXおよびY位置で作業しているため、ヒット範囲が非常に制限されます。

私の質問はこれです:どうすればもっと正確にこれを行うことができますか?

4

3 に答える 3

0

2つの円形オブジェクトのヒットテストは、次のようなものを使用して簡単に実行できます。

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);

少し擬似コードを使用した場合は申し訳ありませんが、それは比較的明確だと思います。

于 2012-05-23T17:32:20.263 に答える
0

弾丸と悪者が常に円形であると仮定すると、次のいずれかを行うことができます...

  1. hitTestPointを使用します。敵のヒットオブジェクトは、半径が弾丸の半径だけ増加した円です。
  2. 2つのオブジェクトの中心間の距離が合計またはそれらの半径よりも大きいかどうかを確認して、ヒットテストを自分で実装します。
于 2012-05-15T12:58:22.420 に答える
0

最初に気付くのはこれです。パフォーマンスについて話すと、以下のコードは失敗しました。1回変更すると、%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))

2つ目は、サークルで作業している場合、@Russelが言うように独自のヒットテストを実装することです。また、Math.sqrt()関数を使用しないようにしてください。

于 2012-05-15T13:32:29.500 に答える