0

AS3 で Main 関数の新しいインスタンスをどのように実行しますか? 基本的に、プログラムが最後に到達したら、プログラムを最初から再実行したいと考えています。最後にすべての子をツリーから削除してから、最初のメソッドを再度実行することを考えましたが、それは不要で面倒です。このクラスは Sprite を拡張します。

編集: カスタム イベントを作成しようとしておりdispatchEvent、プログラムの最後にこれをトリガーするために使用していますが、少し問題があります。これは以下の私の現在のコードです。

RunMain.as 全体:

package  
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class RunMain extends Sprite {

        public function RunMain():void {

            addEventListener(Event.ENTER_FRAME, loop);
        }

        private function loop(event:Event){

            removeEventListener(Event.ENTER_FRAME, loop);
            dispatchEvent(new EndEvent(EndEvent.END_EVENT));
        }

    }
}

EndEvent.as 全体:

package  
{
    import flash.events.Event;

    public class EndEvent extends Event 
    {
        // Event types.
        public static const END_EVENT:String = "event1";

        public function EndEvent(type:String = EndEvent.END_EVENT) 
        {
            super(type);
        }

        override public function clone():Event {
            // Return a new instance of this event with the same parameters.
            return new EndEvent(type);
        }
    }
}

Main.as のパーツ:

public function Main() {
    runMain = new RunMain();
    runMain.addEventListener(EndEvent.END_EVENT, onProgramFinish);
    addChild(runMain);

    init();
    otherMethods();
}

public function onProgramFinish() {
    removeChild(runMain);

    runMain = null;

    runMain = new RunMain() ;
}

Main クラス内onProgramFinish();では、プログラムの最後に行があります。

現在、コンパイラを実行すると、次のエラーが表示されます:
ArgumentError: エラー #1063: Main/onProgramFinish() での引数カウントの不一致。
期待値 0、取得値 1。

続行することを選択すると、プログラムは正常に実行されますが、最後に新しいインスタンスが実行されません。

4

2 に答える 2

0

実際には、特別なクラス コンテナーを作成し、それをメイン クラスで正確に交換 (新規作成または削除) する必要があります。このゲーム クラスはdispatch events、少なくともスプライトはイベントをディスパッチできます。カスタム イベントを作成し、それらをより高いレベルに渡すと、メイン クラスでアクションを実行できます。

class Main extends Sprite {
  public var game:Game ;
  public function Main():void {
    game = new Game(new Player(), "asd") ;
    game.addEventListener(GameEvent.GAME_OVER, onGameOver) ;
    addChild(game) ;
  }

  public function onGameOver(){
    removeChild(game) ;
    //also you can try removing heavy children of game
    game = null ; //Let garbage collector know about object without reference.

    game = new Game(new Player(), "example") ;
  }
}

public class Game extends Sprite {

  public var hero:Hero = new Hero() ;
  public function Game(player:Player, name:String):void {

    addEventListener(Event.ENTER_FRAME, loop) ;
  }

  private function loop(event:Event){
    if (hero.hp == 0){
      removeEventListener(Event.ENTER_FRAME, loop) ;
      dispatchEvent(new GameEvent(GameEvent.GAME_OVER)) ;
    }
  }
}
于 2013-02-20T15:18:44.123 に答える
0

あなたのイベント:

package {
    import flash.events.Event;

public class ProgramEvent extends Event 
{

    public static const FINISH:String = "Finished" ;

    public function ProgramEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
        super(type, bubbles, cancelable);

    } 

    public override function clone():Event 
    { 
        return new ProgramEvent(type, bubbles, cancelable);
    } 

    public override function toString():String 
    { 
        return formatToString("ProgramEvent", "type", "bubbles", "cancelable", "eventPhase"); 
    }

}

}

ランメイン:

package  
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class RunMain extends Sprite {

        public function RunMain():void {

            addEventListener(Event.ENTER_FRAME, loop);
        }

        private function loop(event:Event){

            removeEventListener(Event.ENTER_FRAME, loop);
            dispatchEvent(new ProgramEvent(ProgramEvent.FINISH));
        }

    }
}

そしてメイン:

public function Main() {
    startProgram() ;

    init();
    otherMethods();
}

public function onProgramFinish(event:ProgramEvent) {
    runMain.removeEventListener(ProgramEvent.FINISH, onProgramFinish) ;
    removeChild(runMain);
    runMain = null;
    startProgram() ;
}

public function startProgram(){
  runMain = new RunMain() ;
  runMain.addEventListener(ProgramEvent.FINISH, onProgramFinish);
  addChild(runMain);
}
于 2013-02-20T17:34:07.423 に答える