2010-06-06 5 views
5

che sto creando il mio primo AS3 con FlashDevelop e non capisco il significato delle istruzioni nel costruttore:Che cosa significa "if (stage) init();" significa in 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 
     } 

    } 

} 

Cosa if (stage) init(); significa? Che cos'è Event.ADDED_TO_STAGE? Perché rimuovere l'ascoltatore in init()?

+1

Sono sorpreso di non vedere ancora qui le risposte, quindi mentre stai aspettando: ottieni una lettura interessante se cerchi "Event.ADDED_TO_STAGE" che sospetto risponderà alla tua domanda. (Non saprei per certo, non lavoro in ActionScript, ecco perché questa non è una risposta, ma i link sembrano piuttosto mirati.) Mi sembra che l'effetto aggregato sia quello di garantire che 'init 'è chiamato solo quando il tuo componente è su" stage ": se lo sei già, lo chiami immediatamente. Se non lo sei, colleghi un ascoltatore per l'evento che spara quando sei sul palco (e poi rimuovilo quando viene chiamato). –

+0

Solo una risposta, ma una grande :) – user310291

risposta

9

La classe principale è in genere una classe di documenti -> classe che viene messa in primo piano (radice dell'albero di visualizzazione). Ciò significa che nel costruttore (funzione principale) hai già accesso allo stage.

if(stage) init(); 

significa in realtà che se stage! = Null, eseguire l'inizializzazione.

perché test per null nella classe del documento?
Se il tuo swf get è avvolto in un altro swf. La tua funzione principale non avrà ancora accesso allo stage, perché solo gli sprite (clip filmato, ecc.) Che si trovano nella struttura del display (sul palco) hanno accesso allo stage.
Ti piace questa:

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

Quindi con l'aggiunta di un listener per ADDED_TO_STAGE si è in attesa fino a quando effettivamente ha accesso a stadio, e poi init esso. Rimuovi subito l'ascoltatore perché non ne hai più bisogno.

Questa è una situazione comune nella classe documento (principale), perché è necessario lo stage per aggiungere il menu, l'introduzione, qualsiasi cosa scenica, in modo che sia visibile.

+0

Potrebbe essere utile sottolineare che spesso non è necessario. Se la classe in questione deve fare, per esempio, un listener di eventi chiave a livello di radice, allora avrà bisogno di un riferimento di stage. Ma se la tua classe non ha realmente bisogno di un riferimento allo stage per qualcosa, allora non c'è una ragione particolare per questo tipo di codice (tranne forse come una sorta di inizializzazione pigra). – fenomas

+0

@fenomas true, ma nella mia esperienza non ho mai visto una classe principale che non abbia bisogno di riferimento allo stage. Devi sempre aggiungere qualcosa allo stage, poiché non c'è altro modo di mostrare qualcosa. – Antriel

+1

@Antriel: in generale una classe dovrebbe aggiungere i suoi componenti di visualizzazione a se stessa, in modo che possa essere riutilizzata in altri contesti. Se aggiungi direttamente i bambini allo stage, stai utilizzando una variabile globale de facto. – fenomas

Problemi correlati