Bienvenido a Klr20mg

Cronicas de un desarrollador

 

Estas en : Blog » Acceder el Stage desde cualquier clase AS3
  • Decrease font size
  • Default font size
  • Increase font size
  • color default
  • color verde
  • color azul
Acceder el Stage desde cualquier clase AS3

Al trabajar con clases AS3 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

Actionscript:
  1. package net.tmeister.utils
  2. {
  3.     public dynamic class Global
  4.     {
  5.         private static var global : Global
  6.  
  7.         public static function getInstance() : Global
  8.         {
  9.             if ( global == null )
  10.             {
  11.                 global = new Global( arguments.callee );
  12.             }
  13.             return global;
  14.         }
  15.  
  16.         public function Global( caller : Function = null )
  17.         {   
  18.             if ( caller != Global.getInstance )
  19.             {
  20.                 throw new Error ("Global is a singleton class, use getInstance() instead");
  21.             }
  22.             if ( Global.global != null )
  23.             {
  24.                 throw new Error( "Only one Global instance should be instantiated" );   
  25.             }   
  26.         }
  27.     }
  28. }

Y su modo de uso.

Actionscript:
  1. package
  2. {
  3.     import flash.display.MovieClip;
  4.     import net.tmeister.utils.Global
  5.     public class Main extends MovieClip
  6.     {
  7.         private var global:Global;
  8.        
  9.         public function Main()
  10.         {
  11.             global = Global.getInstance();
  12.             global.stage = stage
  13.             trace('global.stage' + global.stage)
  14.             global.algunOtroValor = new MovieClip()
  15.             trace('global.algunOtroValor ' + global.algunOtroValor)
  16.         }
  17.     }
  18. }

Simple.

 
Compartir

  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • BarraPunto
  • Faves
  • MySpace
  • Pownce
  • Reddit
  • Technorati
  • TwitThis
 
Posibles Posts Relacionados
 
 
5 Comentarios

Si deseas poner codigo en tu comentario utiliza la etiqueta < pre > < /pre >

Interesante.
Yo siempre había usado una clase Global donde almacenaba las variables estáticas tan solo.

Pero para saber el Stage de cada clase lo que hacia era iniciar el metodo ADDED_TO_STAGE antes de hacer nada, entonces el Stage ya era accesible:

...
public function Main():void {
    addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event):void {
    _stage = this.stage;
    ...
}

No se, siempre me ha funcionado bien.

Andros escribio el 14-November-2008 a las 4:11 am

¿Puedes poner un ejemplo de cómo se usaría en otra clase diferente a la Clase del Documento?
Sinceramente es que no veo muy claro qué tratas de hacer. El mismo modo te hubiera bastado con que la variable global fuera del tipo Object.

Eliseo escribio el 18-November-2008 a las 4:30 am

@Eliseo:

De la misma forma que la clase Main, En la clase Main haces la asignacion, ya tienes tus valores por ejemplo stage, ahora desde cualquier otra clase solo debes pedir dicho valor algo asi

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

Si te das cuenta es exactamente lo mismo, solo que ya no estamos asignando valores, solo accediendo a ellos.

Me explico?

Tmeister escribio el 18-November-2008 a las 1:50 pm

Entendido y aplicado, gracias

Eliseo escribio el 19-November-2008 a las 1:41 am

Pues yo lo hago exactamente como pones (en Flash CS3) y me salta "global.stage: null
global.algunOtroValor: [object MovieClip]".

No sé qué hago mal, pero me veo incapaz de acceder al Stage desde una clase. (estoy empezando en esto del as3).

Os explico exactamente mi circunstancia por si alguien me puede echar una mano.

Tengo un archivo llamado escenario.fla cuyo código en el primer fotograma es el siguiente:
import clases.*;
var miEscenario:Escenario=new Escenario();

Dentro de la carpeta clases tengo 2 archivos .as (Escenario.as y Global.as).

El código de Escenario.as es el siguiente:
package clases{
import flash.display.MovieClip;
import clases.Global;
public class Escenario extends MovieClip {
private var global:Global;
public function Escenario() {

global = Global.getInstance();

global.stage = stage;

trace('global.stage: ' + global.stage);

global.algunOtroValor = new MovieClip();

trace('global.algunOtroValor: ' + global.algunOtroValor);

}
}

}

y el de Global.as:
package clases{

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");

}

}

}

}

¿Alguien me puede decir qué estoy haciendo mal?

Muchas gracias por adelantado.

Tx

Tx escribio el 11-December-2008 a las 5:56 am
 
 
Agrega un comentario

Subscribete RSS

 Klr20mg en tu correo!

Recibe el contenido nuevo de klr20mg en tu correo.


 Mini-Posts

Torneos de Poker 2do Lugar

Segundo lugar en el torneo de US$1,000 garantizados, Balance +US$200, perdidas del dia -US$50, Ganancias totales el dia de hoy +US150 8)

2008-11-23 23:32:30
1er lugar US$1,000 Poker

Yeap, parece que la buena racha regresa, Acabo de ganar el primer lugar del torneo de US$1,000 Garantizados, Balance +US$300

2008-11-22 23:08:13
Poker

Este sera un sabado pokero, El balance del fin de semana pasado +US$450, hasta ahora el balance es de -$US300 :(

2008-11-22 14:25:34

 Sigueme en Twitter

De regreso en la oficina despues de las vacaciones.... 1 day ago

Buenas buenas de regreso por aqui... 2 days ago

salud ...... 5 days ago

More updates...

 Categorias

 Archivo