0
//Main Class
package{
  public class Main extends MovieClip{
    private var bombCarrier:BombCarrier;
    private var building:Building;
    private var bomb:Bomb;
    public var buildingArray:Array;

    public function Main(){
      bombCarrier = new Carrier();
      addChild(bombCarrier);
      for(var i:int=0;i<5;i++){
        var xPosition:Number = i*105;
        building = new Building(xPosition, stage.stageHeight);
    addChild(building);
    buildingArray.push(building);
  }
      stage.addEventListener(Event.KeyboardEvent, keyDownFunction);
    }
    public function keyDownFunction(event:KeyboardEvent){
      if(event.keyCode == 70){
        bomb = new Bomb(bombCarrier.x, bombCarrier.y, 0.5);
        addChild(bomb);
      }
    }
  }
}

//Bomb Class
package{
  public class Bomb extends MovieClip{
    private var speed:Number;
    public function Bomb(x, y, speed){
      this.x = x;
      this.y = y;
      this.speed = speed;
      addEventListener(Event.ENTER_FRAME, loop);
    }
    public function loop(event:Event){
      this.y += speed;
      for(var i:int=0;i<Main(parent).buildingArray.length;i++){
        if(hitTestObject(Main(parent).buildingArray[i])){
          this.removeEventListener(Event.ENTER_FRAME, loop);
          Main(parent).buildingArray.splice(i, 1);
          parent.removeChild(this); //This line got Error
        }
      }
    }
  }
}

多くのアプローチを試しましたが、TypeErrorという同じエラーが発生します。エラー#1009:nullオブジェクト参照のプロパティまたはメソッドにアクセスできません。Bomb / loop()で。私はすでにコマンドラインを1行ずつデバッグしようとしていますが、これはこのコード行「parent.removeChild(this);」のようです。問題を示しています。

4

1 に答える 1

1

爆弾を複数回(forループで)削除しようとしているようです。したがって、初めての場合、それはもはや親の子ではありません。

また、爆弾がステージに追加される前にエンターフレームハンドラーを開始するため、その時点まで親はnullになります。

break;初めて爆弾を取り除いたら、ループから抜け出したいでしょう。

//Bomb Class
package{
  public class Bomb extends MovieClip{
    private var speed:Number;
    private var buildingArray:Array;

    public function Bomb(x, y, speed){
      this.x = x;
      this.y = y;
      this.speed = speed;
      addEventListener(Event.ADDED_TO_STAGE,addedToStage,false,0,true);
    }

    private function addedToStage(e:Event):void {
        buildingArray = Main(parent).buildingArray;  //it would be better to just pass it in the constructor
        addEventListener(Event.ENTER_FRAME, loop);
    }

    public function loop(event:Event){
      this.y += speed;
      for(var i:int=0;i<buildingArray.length;i++){
        if(hitTestObject(buildingArray[i])){
          this.removeEventListener(Event.ENTER_FRAME, loop);
          buildingArray.splice(i, 1);
          parent.removeChild(this);
          break; //get out of the loop
        }
      }
    }
  }
}

効率の面では、bombクラスでbuildingArrayへの参照を保持していると、Main(parent)を実行する必要がないため、より高速になります。あなたがそれにアクセスする必要があるたびに。

于 2012-08-31T16:38:07.200 に答える