2010-06-06 15 views
5

estoy creando mi primer AS3 con FlashDevelop y yo no entendemos el significado de las instrucciones en el constructor:¿Qué significa "if (stage) init();" significa en 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 
     } 

    } 

} 

¿Qué significa if (stage) init();? ¿Qué es Event.ADDED_TO_STAGE? ¿Por qué eliminar oyente en init()?

+1

Me sorprende no ver las respuestas aquí todavía, así que mientras estás esperando: Obtienes una lectura interesante si buscas "Event.ADDED_TO_STAGE", que sospecho que responderá a tu pregunta. (No lo sabría con certeza, no trabajo en ActionScript, por eso esta no es una respuesta. Pero los enlaces se ven bastante bien). Me parece que el efecto agregado es asegurar que 'init 'se invoca solo cuando su componente está en" etapa ": si ya lo está, lo llama inmediatamente. Si no lo eres, conectas un oyente para el evento que se activa cuando te suben al escenario (y luego lo quitas cuando se lo llaman). –

+0

Solo una respuesta, pero excelente :) – user310291

Respuesta

9

La clase principal suele ser una clase de documento -> clase que se pone en etapa (raíz del árbol de visualización) como primero. Eso significa que en el constructor (función principal) ya tienes acceso a la etapa.

if(stage) init(); 

en realidad significa que si stage! = Null, ejecuta la inicialización.

¿Por qué probar null en la clase de documento?
Si su swf está envuelto en otro swf. Su función principal todavía no tendrá acceso al escenario, ya que solo los sprites (clips de película, etc.) que se encuentran en el árbol de visualización (en el escenario) tienen acceso al escenario.
De esta manera:

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

Así que mediante la adición de un oyente a ADDED_TO_STAGE usted está esperando hasta que realmente tiene acceso a etapa, y luego se init. Eliminas al oyente de inmediato porque ya no lo necesitas.

Esta es una situación común en la clase de documento (principal), porque necesita una etapa para agregar su menú, introducción, lo que sea para la etapa, por lo que es visible.

+0

Podría valer la pena señalar que esto a menudo no es necesario. Si la clase en cuestión necesita hacer, digamos, un oyente de eventos clave a nivel de raíz, entonces necesitará una referencia de etapa. Pero si su clase no necesita una referencia de escenario para nada, entonces no hay una razón particular para este tipo de código (excepto tal vez como una especie de inicialización lenta). – fenomas

+0

@fenomas cierto, pero en mi experiencia, nunca he visto una clase principal que no necesite referencia al escenario. Siempre debe agregar algo al escenario, ya que no hay otra manera de mostrar algo. – Antriel

+1

@Antriel: en general, una clase debe agregar sus componentes de visualización a sí misma, por lo que puede reutilizarse en otros contextos. Si agrega niños directamente al escenario, está usando una variable global de facto. – fenomas