2012-05-15 74 views
0

我一直在關注hitTestObject的VS hitTestPoint討論VS定製則hitTest相當長的一段時間。通常,我已經沿着使用Point的路線,給定了形狀選項。AS3:hitTestObject VS hitTestPoint的子彈VS敵人

但是 - 我現在要做的子彈擊中敵人圓形的命中測試。我目前使用的是哪種下面是:

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

現在,很明顯這是導致子彈停在各地熱播的阿爾法地區,並將其視作一擊。

我認爲我將能夠很容易地做到以下幾點,但它不工作:

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

這將導致一個非常,非常有限的命中範圍,因爲我們正在與單個X工作, Y位置。

我的問題是這樣的:我怎樣才能做到這一點更accurancy?

+0

我應該指出,這則hitTest是bullet1.as –

回答

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

+0

我從來沒想過這件事。謝謝 –

+0

不客氣。 – ymutlu

0

假設子彈和壞人總是圓形的,你既可以...

  1. 使用hitTestPoint,與敵人命中的對象是其
  2. 半徑增加了子彈的半徑,或圓
  3. 通過檢查兩個對象的中心之間的距離是否大於總和或其半徑來自己執行命中測試。
+0

內我想我的大部分問題都來自於不完全瞭解如何工作hitTestPoint。如果我只允許指定一個X和一個Y位置,那麼它是如何能夠檢查周圍的敵人? –

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,但我認爲這是比較明確的。