Как в Flex/AS3 получить определение класса встроенного актива с помощью getDefinitionByName?
-
01-07-2019 - |
Вопрос
У меня есть класс со множеством встроенных ресурсов.
Внутри класса я хотел бы получить определение класса актива по имени.Я пробовал использовать 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 = новое определение();