¿Quieres registrarte?

Acceder el Stage desde cualquier clase en Actionscript 3

Por: Tmeister
13 de Noviembre del 2008

Al trabajar con clases Actionscript 3 en nuestros proyectos hay ocasiones en los que debemos acceder al stage principal de nuestra aplicación desde clases que no extienden a “DisplayObject”, haciendo que debamos pasar como parámetro dicho stage a las clases, esto funciona pero en realidad es un poco “sucio”.

Una solución simple es crear una clase singleton, en la cual, podemos almacenar no solo el stage principal, sino cualquier otro valor que necesitemos en varias clases. Algo así como _global de AS2, lo recuerdan?

Aquí la clase

Código :

package net.tmeister.utils
{
   public dynamic class Global
   {
      private static var global : Global

      public static function getInstance() : Global
      {
         if ( global == null )
         {
            global = new Global( arguments.callee );
         }
         return global;
      }

      public function Global( caller : Function = null ) 
      {   
         if ( caller != Global.getInstance )
         {
            throw new Error ("Global is a singleton class, use getInstance() instead");
         }
         if ( Global.global != null )
         {
            throw new Error( "Only one Global instance should be instantiated" );   
         }   
      }
   }
}



Y su modo de uso.

Código :

package 
{
   import flash.display.MovieClip;
   import net.tmeister.utils.Global
   public class Main extends MovieClip
   {
      private var global:Global;
      
      public function Main()
      {
         global = Global.getInstance();
         global.stage = stage
         trace('global.stage' + global.stage)
         global.algunOtroValor = new MovieClip()
         trace('global.algunOtroValor ' + global.algunOtroValor)
      }
   }
}


Simple. :cool:

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas actionscript_3 singleton patrones

Comentarios | Enviar un comentario
Si, esa es una buena manera de acceder a datos globales. Buen tip (y)
Por: Zguillez
Buen uso de "dynamic" (y) , pero no siempre abusemos de lo bueno que es con nosotros :P
Gracias por el Tip :)
Por: Otaku RzO
No quiero ponerme pesado ni nada, pero no hay buenas practicas en programacion que incluyan variables globales. Idealmente, todos nuestro objetos deberian pedir en los constructores lo que necesitan para funcionar sin tratar de acceder de otro modo a estos datos.

Explicaciones de porque es mala idea hay montones, pero la mejor es que genera codigo mas dificil de mantener y clases que estan linkeadas de forma poco intuitiva y por lo tanto no son facilmente rehusables.
Por: HernanRivas-blog
En lo personal me parece que puede llegar a ser muy útil este Tip !
Por: M@U
¿Podrías poner un ejemplo de cómo funcionaría con otra clase? Es que no lo veo demasiado claro. El ejemplo que pones, para la clase main es lo mismo que si tuviéramos un objeto simple
Por: Eliseo2
No es mejor poner Main(root)
Por: UMMM-blog
Hello :)

Mas facil :

//////////////

package
{
import flash.display.MovieClip;

public class Main extends MovieClip
{
private var global:Global;

public function Main()
{
global = _global ;
stage = stage ;
}

public static var global:* ;
public static var stage:Stage ;

}
}

var _global:* = this ;


//////////////

ex : http://code.google.com/p/as-gard/source/browse/trunk/AS3/trunk/src/asgard/display/ApplicationDisplay.as

El singleton no es util y a static property es muy interesente : Main.stage , Main.global

EKA+ :)
Por: ekameleon-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.