В Flex / AS3 как получить определение класса встроенного ресурса с помощью getDefinitionByName - PullRequest
5 голосов
/ 18 сентября 2008

У меня есть класс со многими встроенными активами.

Внутри класса я хотел бы получить определение класса актива по имени. Я пытался использовать getDefinitionByName (), а также ApplicationDomain.currentDomain.getDefinition (), но ни одна из них не работает.

Пример:

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

Ответы [ 4 ]

8 голосов
/ 18 сентября 2008

Это не отвечает на ваш вопрос, но может решить вашу проблему. Я считаю, что делать что-то вроде этого должно работать:

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

Мне сложно вспомнить, работает ли обозначение в скобках на закрытых классах. Если это не так, простое решение - пометить класс как динамический.

3 голосов
/ 28 апреля 2011

Причина, по которой ваш метод не работает, состоит в том, что «Image1Class» - это имя переменной , а не фактическое Имя класса .

Вы можете получить имя класса вот так

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

Что, как вы можете видеть, означает, что имя вашего класса (то, которое должно быть передано в функцию) является чем-то вроде MyClass_Image1Class.

2 голосов
/ 18 сентября 2008

Вам не нужно использовать какие-либо причудливые методы getDefinitionByName (), просто обратитесь к нему динамически. В вашем случае замените строку «Сбой» на:

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

И это должно сделать.

0 голосов
/ 21 июня 2009

Спасибо большое! Я просто потратил почти 5 часов, пытаясь заставить POS getDefinitionByName работать с getQualifiedClassName, который я был готов выбросить! Мой окончательный рабочий код выглядит следующим образом и даже получает имя строки из массива.

CreatureParam - это двумерный массив строк;

Тип - это целое число, которое отправляется на флэш-память с помощью тега HTML, который, в свою очередь, поступает из базы данных MYSQL через PHP.

Mark1_cb - это комбинированный список, который находится на сцене и имеет имя экземпляра. Его вывод также является целым числом.

Таким образом, этот код непосредственно ниже импортирует класс "BirdBodyColor_mc" из внешнего SWF-файла "ArtLibrary.swf". BirdBodyColor_mc - это мувиклип, созданный из изображения в формате png. Обратите внимание, что вы должны дважды щелкнуть мувиклип в ArtLibrary.fla и вставить второй ключевой кадр. Видеоклипы, по-видимому, нуждаются в двух кадрах, или Flash пытается импортировать их как спрайт и вызывает несовпадение типов.

[Embed (source = "ArtLibrary.swf", symbol = "BirdBodyColor_mc")] var BirdBodyColor_mc: Class;

Обычно я ставлю экземпляр этого класса мувиклипа на сцену, используя этот код.

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

var Определение: Class = this ["BirdBodyColor_mc"] как Class; var Mark1: MovieClip = new Definition ();

Но мне нужно сделать это, используя строковое значение, найденное в моем массиве. Вот код для этого.

var Определение: Class = this [CreatureParam [Type] [Mark1_cb + 2]] как Class; var Mark1: MovieClip = new Definition ();

...