2010-06-06 5 views
5

나는에 FlashDevelop 내 첫 AS3을 만드는거야 내가 생성자의 지시의 의미를 이해하지 않습니다"if (stage) init();"은 무엇을합니까? ActionScript에서 의미가 있습니까?

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

    public class Main extends Sprite 
    { 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      // entry point 
     } 

    } 

} 

if (stage) init(); 무엇을 의미합니까? Event.ADDED_TO_STAGE는 무엇입니까? init()에서 수신 거부를 제거하는 이유는 무엇입니까?

+1

아직 답을 보지 못해서 놀랍습니다. 기다리고있는 동안 : 질문에 대답 할 것으로 의심되는 "Event.ADDED_TO_STAGE"를 검색하면 재미있는 독서를 볼 수 있습니다. (나는 확실히 알지 못 하겠지만, ActionScript에서는 작동하지 않으므로 이것이 답이 아닙니다.하지만 링크가 꽤 목표물로 보입니다.) 총 효과가 'init '는 컴포넌트가 "무대"에있는 경우에만 호출됩니다. 이미있는 경우 즉시 호출합니다. 그렇지 않은 경우 무대에 올려 놓을 때 발생하는 이벤트에 대한 청취자를 연결합니다 (호출 될 때 제거합니다). –

+0

단 하나의 대답이지만 훌륭한 답변 : – user310291

답변

9

메인 클래스는 일반적으로 첫 번째로 스테이지 (표시 트리의 루트)에 배치되는 문서 클래스 -> 클래스입니다. 즉, 이미 스테이지에 액세스 할 수있는 생성자 (Main 함수)에 있음을 의미합니다.

if(stage) init(); 

실제로 스테이지! = null 인 경우 초기화를 실행한다는 것을 의미합니다.

왜 문서 클래스에서 null을 테스트합니까?
swf가 다른 swf로 래핑 된 경우. 스테이지 트리에있는 스프라이트 (무비 클립 등) 만 스테이지에 액세스 할 수 있기 때문에 Main 함수는 스테이지에 아직 액세스 할 수 없습니다. 이처럼
:

var mc:MovieClip = new MovieClip();//mc.stage == null 
stage.addChild(mc);//mc.stage != null 

그래서 당신은 실제로 무대에 액세스 할 때까지 기다리고 있습니다 ADDED_TO_STAGE 다음을 init를 리스너를 추가하여. 더 이상 필요가 없기 때문에 리스너를 즉시 제거합니다.

메뉴 (인트로)를 스테이지에 추가하여 표시 할 수 있도록 스테이지가 필요하므로 문서 (주) 클래스의 일반적인 상황입니다.

+0

이것은 종종 필요하지 않음을 지적하는 가치가 있습니다. 문제의 클래스가, 예를 들어, 루트 레벨의 키 이벤트 리스너를 생성 할 필요가있는 경우, 스테이지 참조가 필요합니다. 하지만 클래스에 실제로 무대 참조가 필요하지 않은 경우 이러한 종류의 코드에는 특별한 이유가 없습니다 (지연 초기화의 일종을 제외하고). – fenomas

+0

@fenomas 사실이지만, 제 경험상 무대에 대한 참조가 필요없는 주요 수업을 본 적이 없습니다. 무언가를 보여줄 다른 방법이 없으므로 무대에 무언가를 추가해야합니다. – Antriel

+1

@Antriel : 일반적으로 클래스는 디스플레이 구성 요소를 자체에 추가해야하므로 다른 컨텍스트에서 다시 사용할 수 있습니다. 스테이지에 직접 자식을 추가하는 경우 사실상의 전역 변수를 사용하고 있습니다. – fenomas

관련 문제