Pregunta

Tengo una clase con muchos activos integrados.

Dentro de la clase, me gustaría obtener la definición de clase de un activo por su nombre.Intenté 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");
¿Fue útil?

Solución

Esto no responde a tu pregunta, pero puede resolver tu 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");

Me cuesta recordar si la notación entre corchetes funciona en clases selladas.Si no es así, una solución simple es marcar la clase como dinámica.

Otros consejos

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

Puedes obtener el nombre de la clase así.

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

Lo que, como puede ver, significa que el nombre de su clase (el que debe pasarse a la función) es algo así como MyClass_Image1Class.

No es necesario utilizar ningún método sofisticado getDefinitionByName(), simplemente consúltelo dinámicamente.En su caso, reemplace la línea 'Falla' con:

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

Y eso debería bastar.

¡Muchas gracias!¡Acabo de pasar casi 5 horas tratando de hacer que el POS getDefinitionByName funcione con el getQualifiedClassName que estaba listo para tirar 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 bidimensional de cadenas;

El 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 está en el escenario y tiene un nombre de instancia.Su salida también es un número entero.

Entonces, este código directamente debajo importa la clase "BirdBodyColor_mc" desde un 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.Los clips de película aparentemente necesitan dos fotogramas o flash intenta importarlos como un objeto y provoca una falta de coincidencia de tipos.

Incrustar (fuente = "artLibrary.swf", Symbol = "BirdBodyColor_mc")] var BirdBodyColor_mc: class;

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

myMC:MovieClip = nuevo BirdBodyColor_mc();addChild(miMC);

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top