2013-03-23 3 views
0

안녕하세요. 문제가 있으며 그 원인을 알 수 있지만 해결 방법을 모릅니다. 나는 누군가가 좋은 것 내가이 문제를 해결하는 데 도움을 줄 수 ... 오류는 여기Error # 1009 ActionScript 3에서 적을 맞았을 때 총알을 제거하려고 시도했을 때

TypeError: Error #1009: Cannot access a property or method of a null object reference. at Bullet/removeSelf()[C:\Users\Alan\Desktop\game copy\Bullet.as:56] at Bullet/loop()[C:\Users\Alan\Desktop\game copy\Bullet.as:44]

입니다 주요 ACTIONS 총알 PS를 제거 ONE 코드입니다. 죄송합니다. 여기

stage.addEventListener(Event.ENTER_FRAME, testCollisions); 

//Check for collisions between an enemies array and a Lasers array 
function testCollisions(e:Event):void 
{ 

    var tempEnemy:MovieClip; 
    var tempLaser:MovieClip; 

    for (var i:int=enemies.length-1; i >= 0; i--) 
    { 
     tempEnemy = enemies[i]; 
     for (var j:int=bullets.length-1; j>=0; j--) 
     { 
      tempLaser = bullets[j]; 
      if (tempLaser.hitTestObject(tempEnemy)) 
      { 

       removeChild(tempEnemy); 
       removeLaser(j); 

      } 
     } 
    } 
} 




function removeLaser(idx:int) 
{ 
    parent.removeChild(bullets[idx]); 
    bullets.splice(idx,1); 
} 

제거하는 것이없는 경우는 빈 기능 removeSelf를 호출되어, IT는 IT가

public class Bullet extends MovieClip { 

     private var speed:int = 30; 
     private var initialX:int; 
     public var eligableForRemove:Boolean = false; 



     public function Bullet(playerX:int, playerY:int, playerDirection:String) { 

      // constructor code 
      if(playerDirection == "left") { 
       speed = -30; //speed is faster if player is running 
       x = playerX - 25; 
      } else if(playerDirection == "right") { 
       speed = 30; 
       x = playerX + 25 
      } 
      y = playerY - 75; 

      initialX = x; //use this to remember the initial spawn point 

      addEventListener(Event.ENTER_FRAME, loop); 
     } 

     public function loop(e:Event):void 
     { 
      //looping code goes here 
      x += speed; 

      if(speed > 0) { //if player is facing right 
       if(x > initialX + 640) { //and the bullet is more than 640px to the right of where it was spawned 
        removeSelf(); //remove it 
        eligableForRemove = true; 
       } 
      } else if (speed < 0) { //else if player is facing left 
       if(x < initialX - 640) { //and bullet is more than 640px to the left of where it was spawned 
        removeSelf(); //remove it 
        eligableForRemove = true; 
       } else { 
        eligableForRemove = false; 
        } 
      } 
     } 

     public function removeSelf():void 
     { 
      if(eligableForRemove == true){trace("remove self"); 
      removeEventListener(Event.ENTER_FRAME, loop); //stop the loop 
      this.parent.removeChild(this); //tell this object's "parent object" to remove this object 
      //in our case, the parent is the background because in the main code we said: 
      //back.addChild(bullet); 
      } 

     } 

    } 

} 

내가 원인을 생각 제거 BULLET 클래스의 코드입니다. 그래서 eligableForRemove 변수를 추가했지만 올바르게 배치하지 않았을 수 있습니다. 누군가가이 문제를 해결할 수있게 도와 주시면 감사하겠습니다. 또한 기본 액션에서 글 머리 기호를 제거하려고 시도하면 꼭해야합니다. 호출자 오류의 자식. 도와주세요.

답변

0

은이 두 번 아이를 제거하려고에 의해 발생 될 수 있음을 맞아, 당신은 당신이 그렇게 removeSelf() 업데이트 된 값을 볼 수 없습니다, removeSelf() 전화 후 eligableForRemove을 설정하고 있습니다.

그러나, 나는 문제가 당신이 removeLaser()에 총알을 제거하고 있지만 하지이 사망했다고 총알을 말하는, 그래서 루프를 계속 실행하고, 결국이 범위를 벗어나 및을 시도하는 생각 다시 스스로 제거하십시오.

당신은 eligableForRemove을 제거하고, 단지에 removeLaser()을 변경 얻을 수 있어야합니다 : (. 런타임 이미이 Bullet 알고있다로, 또는 bullets 경우 bullets[idx].removeSelf()을 바로 할 수있는 Vector.<Bullet>입니다)

function removeLaser(idx:int) 
{ 
    (bullets[idx] as Bullet).removeSelf(); 
    bullets.splice(idx,1); 
} 

+0

오 예, 해결되었습니다. 감사합니다. – AlanZ2223

+0

안녕하세요, 저에게 다른 도움을 주시겠습니까? – AlanZ2223

+0

나는 방금 전진하고 있었지만 내일 또 다른 질문이 있으면 조심할 것이다. –