2010-06-06 3 views
5

tworzę moją pierwszą AS3 z FlashDevelop i nie rozumiem sensu instrukcją w konstruktorze:Co oznacza "if (stage) init();" w języku 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(); Co oznacza? Co to jest Event.ADDED_TO_STAGE? Dlaczego warto usunąć słuchacza w init()?

+1

Jestem zaskoczony, że nie widzę tu jeszcze odpowiedzi, więc podczas oczekiwania: otrzymasz ciekawą lekturę, jeśli wyszukasz hasło "Event.ADDED_TO_STAGE", które, jak podejrzewam, odpowie na twoje pytanie. (Nie wiem na pewno, nie działam w ActionScripcie, dlatego nie jest to odpowiedź, ale linki wyglądają ładnie na celu.) Wydaje mi się, że efektem agregacji jest zapewnienie, że 'init 'jest wywoływane tylko wtedy, gdy twój komponent jest na" scenie ": jeśli już jesteś, natychmiast go wywołasz. Jeśli tak nie jest, podpinamy słuchacza zdarzenia, które zostanie wywołane, gdy zostaniesz postawiony na scenie (a następnie usuniesz go, gdy zostanie wywołany). –

+0

Tylko jedna odpowiedź, ale świetna :) – user310291

Odpowiedz

9

Główna klasa to zazwyczaj klasa dokumentu -> klasa, która jest umieszczana na stole montażowym (katalog główny drzewa wyświetlania). Oznacza to, że w konstruktorze (funkcja główna) masz już dostęp do sceny.

faktycznie oznacza, że ​​jeśli etap! = Null, uruchom inicjalizację.

dlaczego test na zerowy w klasie dokumentu?
Jeśli twój plik SWF zostanie zapakowany w inny plik SWF. Twoja główna funkcja nie będzie miała jeszcze dostępu do sceny, ponieważ tylko drzwiczki (klipy filmowe itp.) Znajdujące się na drzewie wyświetlania (na scenie) mają dostęp do sceny.
Jak to:

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

Więc dodając słuchacza ADDED_TO_STAGE czekasz aż faktycznie mają dostęp do sceny, a następnie init go. Usuwasz słuchacza od razu, ponieważ już go nie potrzebujesz.

Jest to częsta sytuacja w klasie dokumentu (głównego), ponieważ potrzebujesz etapu, aby dodać menu, wstęp, cokolwiek do sceny, więc jest widoczne.

+0

Warto zauważyć, że często nie jest to konieczne. Jeśli dana klasa musi utworzyć, na przykład, program nasłuchujący zdarzeń klucza głównego, wówczas będzie potrzebował odniesienia do etapu. Ale jeśli twoja klasa właściwie nie potrzebuje referencji scenicznej do niczego, wtedy nie ma żadnego szczególnego powodu dla tego rodzaju kodu (z wyjątkiem być może pewnego rodzaju leniwego inicjowania). – fenomas

+0

@fenomas prawda, ale z mojego doświadczenia nigdy nie widziałem głównej klasy, która nie potrzebuje odniesienia do sceny. Zawsze musisz dodać coś na scenę, ponieważ nie ma innego sposobu na pokazanie czegoś. – Antriel

+1

@Antriel: Ogólnie rzecz biorąc, klasa powinna dodawać do siebie swoje komponenty wyświetlania, aby mogła być ponownie wykorzystana w innych kontekstach. Jeśli dodajesz dzieci bezpośrednio na scenie, używasz de facto zmiennej globalnej. – fenomas