2013-02-20 1 views
0

AS3에서 Main 함수의 새 인스턴스를 어떻게 실행 하시겠습니까? 기본적으로 프로그램이 프로그램의 끝 부분에 도달하면 프로그램이 처음부터 다시 실행되기를 원합니다. 마지막에 트리에서 모든 자식을 제거하고 첫 번째 방법을 다시 실행하는 방법에 대해 생각했지만 불필요하고 지저분 해 보입니다. 클래스는 Sprite를 확장합니다.AS3에서 Main()의 다른 인스턴스를 실행하는 방법

편집 : 사용자 지정 이벤트를 만들고 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 : Main.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); 
     } 
    } 
} 

부품 : 내 메인 클래스 내부

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

, 나는 라인을 가지고 프로그램 끝의 onProgramFinish();.

현재 컴파일러를 실행할 때 오류가 발생합니다.
ArgumentError : 오류 # 1063 : Main/onProgramFinish()에서 인수 개수가 일치하지 않습니다.
예상 한 0은 1을 받았습니다.

계속 진행을 선택하면 프로그램이 정상적으로 실행되지만 끝날 때 새 인스턴스가 실행되지 않습니다.

답변

0

사실 특수 클래스 컨테이너를 만들어 메인 클래스에서 정확히 바꿔야합니다 (새로 만들기 또는 삭제). 이 게임 클래스는 dispatch events 일 수 있으며 적어도 스프라이트는 이벤트를 보낼 수 있습니다. 커스텀 이벤트를 생성하여 상위 레벨과 상위 레벨로 전달하면 Main 클래스에서 액션을 수행 할 수 있습니다.

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)) ; 
    } 
    } 
} 
+0

그것은 게임이지만 단지 애니메이션 형태의 프로그램이 될 수 없습니다. AS3 설명서에서 액세스 할 수있는 GameEvent 클래스가 없습니다. AS3에 내장 된 다른 유형의 이벤트를 사용하여이를 수행 할 수있는 방법이 있습니까? 또한, 다른 클래스를 만드는 대신이 모든 것을 Main() 클래스 문서 내에서 실행할 수 있습니까? – ArrayOutOfBounds

+0

그게 그 예가 아니 었습니다. GameEvent는 존재하지 않지만 만들 수 있습니다. 모든 클래스, 모든 프로그램을 만들 수 있으며, 모든 유형의 기존 이벤트를 사용하고 [자신 만의 이벤트를 만들 수 있습니다.] (http://jeffnehlsen.com/2011/02/actionscript-3-custom-events-explained/). 그리고 ofc는 Main 클래스의 모든 것을 실행할 수 있지만 지저분 해 보입니다. – vikingmaster

+0

알겠습니다. GAME_OVER는 CustomEvent 내부의 메소드입니까? – ArrayOutOfBounds

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

} 

} 

RunMain :

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); 
} 
+0

이것이'Main()'내부에서'addChild (runMain);을 제거해야한다는 것을 의미합니까? onProgramFinish 안에 자식을 추가하면 오류 1136이 발생합니다. 잘못된 인수 수입니다. 'onProgramFinish();'행에 대해 예상 됨 1. – ArrayOutOfBounds

+0

이 큰 코드를 확인하십시오. – vikingmaster

+0

아, 그게 더 OOP 방식의 일입니다. 고마워요.그러나 그것을 호출 할 때 여전히 onProgramFinish();에 대한 동일한 인수 오류가 발생합니다. 내가 잘못하고 있다고 생각 하나? – ArrayOutOfBounds

관련 문제