2008-09-17 5 views
5

Tengo una clase con muchos activos incorporados.En Flex/AS3, ¿cómo obtengo una definición de clase de un activo incorporado con getDefinitionByName

Dentro de la clase, me gustaría obtener la definición de clase de un activo por nombre. He intentado usar getDefinitionByName(), y también ApplicationDomain.currentDomain.getDefinition() pero ninguno funciona.

Ejemplo:

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    var ClassDef:Class = getDefinitionByName(name) as Class; //<<-- Fails 
    _image = new ClassDef() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

Respuesta

8

Esto no responde a su pregunta, pero puede resolver su problema. Creo que hacer algo como esto debería funcionar:

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    _image = new this[name]() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

Estoy teniendo un momento difícil recordar si notación de corchetes trabaja en clases cerradas. Si no es así, una solución simple es marcar la clase como dinámica.

+0

¡Hola! Buen trabajo, eso funcionó! – user8399

2

No necesita utilizar ningún método elegante de getDefinitionByName(), simplemente haga referencia dinámicamente a él. En su caso, reemplace la línea 'Falla' con:

var classDef:Class = MyClass[name] as Class; 

Y eso debería hacerlo.

+0

esto funciona! gracias davr – jedierikb

0

¡Muchas gracias! Acabo de pasar casi 5 horas tratando de conseguir que el POS getDefinitionByName funcione con el getQualifiedClassName que estaba listo para lanzar cosas !! Mi código de trabajo final se ve así e incluso obtiene el nombre de la cadena de una matriz.

CreatureParam es una matriz de 2 dimensiones de cadenas;

Tipo es un número entero que se envía a Flash mediante una etiqueta HTML que, a su vez, proviene de una base de datos MYSQL a través de PHP.

Mark1_cb es un cuadro combinado que se encuentra en el escenario y tiene un nombre de instancia. Su salida también es un número entero.

Por lo tanto, este código directamente debajo importa la clase "BirdBodyColor_mc" desde un archivo SWF externo "ArtLibrary.swf". BirdBodyColor_mc es un clip de película creado a partir de una imagen png. Tenga en cuenta que debe hacer doble clic en el clip de película en ArtLibrary.fla e insertar un segundo fotograma clave. Movieclips aparentemente necesita dos marcos o flash intenta importarlo como un sprite y causa un tipo de desajuste.

[Insertar (fuente = "ArtLibrary.swf", símbolo = "BirdBodyColor_mc")] var BirdBodyColor_mc: Clase;

Normalmente pondría una instancia de esta clase de clip de película en el escenario usando este código.

myMC: MovieClip = new BirdBodyColor_mc(); addChild (myMC);

var Definición: Clase = this ["BirdBodyColor_mc"] como Clase; var Mark1: MovieClip = new Definición();

Pero necesito hacer esto usando un valor de cadena buscado en mi matriz. Así que aquí está el código para eso.

var Definición: Clase = this [CreatureParam [Type] [Mark1_cb + 2]] as Class; var Mark1: MovieClip = new Definición();

3

La razón por la que su método no funciona es porque "Image1Class" es un nombre de variable de , no el nombre real de la clase .

Usted puede obtener el nombre de la clase como esto

import flash.utils.getQualifiedClassName; 
trace(getQualifiedClassName(Image1Class)); 

que como se puede ver, significa que su nombre de la clase (la que debe ser introducida en la función) es algo así como MyClass_Image1Class.

+0

Pero, aún recomendaría uno de los métodos anteriores, ya que 'getDefinitionByName()' solo sería necesario si está accediendo a esas imágenes _outside_ de su clase actual. – IQAndreas

Cuestiones relacionadas