Em Flex / AS3, como faço para obter uma definição de classe de ativo incorporado com getDefinitionByName

StackOverflow https://stackoverflow.com/questions/87557

Pergunta

Eu tenho uma classe com muitos recursos incorporados.

Dentro da classe, eu gostaria de obter a definição de classe de um ativo pelo nome. Eu tentei usar getDefinitionByName () e também ApplicationDomain.currentDomain.getDefinition (), mas não trabalho.

Exemplo:

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");
Foi útil?

Solução

Esta não responder à sua pergunta, mas pode resolver seu problema. Acredito que fazer algo como isso deve 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");

Eu estou tendo um momento difícil lembrar se a notação suporte funciona em classes selados. Se isso não acontecer, uma solução simples é para marcar a classe como dinâmica.

Outras dicas

A razão o seu método não funciona é porque "Image1Class" é uma variável nome, não o real nome Class .

Você pode obter o nome da classe como este

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

que, como você pode ver, significa que o seu nome da classe (o que deve ser passado para a função) é algo como MyClass_Image1Class.

Você não precisa usar qualquer getDefinitionByName fantasia () métodos, simplesmente se referem a ele de forma dinâmica. No seu caso, substitua o 'falha' linha com:

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

E que deve fazê-lo.

Muito obrigado! Passei quase 5 horas a tentar obter o POS getDefinitionByName ao trabalho com o getQualifiedClassName que eu estava pronto para atirar coisas !! Meu código de trabalho final se parece com isso e ainda recebe o nome de cadeia de uma matriz.

CreatureParam é uma matriz tridimensional de duas cadeias;

Tipo é um número inteiro que é enviado a piscar pela tag HTML que é por sua vez, vem de um banco de dados MYSQL via PHP.

Mark1_cb é um combobox que está no palco e tem um nome de instância. É de saída é também um inteiro.

Assim, este código diretamente abaixo importações da classe "BirdBodyColor_mc" de um swf "ArtLibrary.swf" externo. BirdBodyColor_mc é um movieclip criado a partir de uma imagem png. Note que você deve clicar duas vezes sobre o clipe de filme no ArtLibrary.fla e inserir um segundo quadro-chave. Movieclips aparentemente precisa de dois quadros ou tentativas flash para importá-lo como um sprite e provoca uma incompatibilidade de tipo.

[Embed (source = "ArtLibrary.swf", símbolo = "BirdBodyColor_mc")] var BirdBodyColor_mc: Classe;

Normalmente eu iria colocar uma instância desta classe movieclip no palco usando este código.

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

var Definição: class = este [ "BirdBodyColor_mc"] como Classe; var Mark1: MovieClip = new Definição ();

Mas eu preciso fazer isso usando um valor de string olhou na minha matriz. Então, aqui está o código para isso.

var Definição: Class = este [CreatureParam [Type] [Mark1_cb + 2]] como Classe; var Mark1: MovieClip = new Definição ();

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top