2012-05-15 4 views
0

나는 hitTestObject 대 hitTestPoint 대 커스텀 hitTest에 대한 토론을 꽤 오랫동안 해왔다. 종종 모양 옵션을 사용하여 Point를 사용하는 경로를 따라갔습니다.AS3 : hitTestObject 대 Bullet 대 Enemy의 hitTestPoint

그러나 이제는 원형 적을 때리는 탄환의 히트 테스트를하려고합니다. 내가 현재 사용하고 아래에 있습니다 : 이제

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 위치.

내 질문은 : 어떻게하면 더 정확한 결과를 얻을 수 있습니까?

+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

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

미안하지만 Psudocode가 조금이라도 지나간다면 죄송하지만 비교적 명확하다고 생각합니다.