Как в Flex/AS3 получить определение класса встроенного актива с помощью getDefinitionByName?

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

Вопрос

У меня есть класс со множеством встроенных ресурсов.

Внутри класса я хотел бы получить определение класса актива по имени.Я пробовал использовать 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");
Это было полезно?

Решение

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

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

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

Другие советы

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

Вы можете получить имя класса следующим образом

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

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

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

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

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

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

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

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

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

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

Inced (source = "artlibrary.swf", symbol = "birdbodycolor_mc")] var birdbodycolor_mc: class;

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

myMC:MovieClip = новый BirdBodyColor_mc();addChild (myMC);

var Определение:Класс = this["BirdBodyColor_mc"] как Класс;вар Mark1:MovieClip = новое определение();

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

var Определение: Класс = this[CreatureParam[Type][Mark1_cb + 2]] как класс;вар Mark1:MovieClip = новое определение();

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top