Flash AS3 присоединяет символ SWC на ​​основе элемента XML - PullRequest
0 голосов
/ 24 марта 2011

У меня есть SWC, который содержит 8 спрайтов, каждый из которых имеет идентификатор связи с шаблоном Icon01, Icon02 и т. Д. Я могу создать экземпляр одного из этих спрайтов, выполнив что-то в форме

var i:Icon01 = new Icon01();
this.addChild(i);

Однако у меня есть файл XML, который содержит разные сообщения, и каждое сообщение содержит элемент изображения, который помечен таким же образом

...
<message>
    <image>Icon01</image>
</message>
...

Я хотел бы иметь возможность проанализировать XML и иметьсоответствующий спрайт прикреплен к сцене.Как это можно сделать?

Мои данные XML анализируются в массив объектов, а элемент XML живет в

var msgObj:Object = this.theMessages.messages.shift();
trace(msgObj.image);

Но я не могу понять, как его преобразовать вспрайт и добавить его на сцену.Я попытался сделать

var s:Sprite = msgObj.image as Sprite;
this.addChild(s);

И я только что получил ошибку об объекте NULL.Спасибо за любую помощь.

Ответы [ 3 ]

1 голос
/ 24 марта 2011

getDefinitionByName(msgObj.image) будет правильным способом, но вам нужно будет сослаться на каждый класс, который вы, возможно, вызываете, иначе он не будет скомпилирован.

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

Другой вариант - загрузить их, используя функцию [embed] вместо использования swc, таким образом, выГарантируется, что они скомпилированы и могут быть вызваны в любое время.

1 голос
/ 15 марта 2012

В FlashDevelop 4.0.1 (не уверен в старых версиях), щелкните правой кнопкой мыши файл .swf.Прямо под опцией «Добавить в библиотеку» находится «Опции».Вместо «Библиотека (включенные ссылочные классы)» выберите «Включенная библиотека (включает полностью)».

Похоже, что при первом параметре, при вызове класса, например, new BackgroundImage();, на класс ссылается, поэтому он включается.При вызове класса с помощью var backgroundImage:Class = getDefinitionByName("BackgroundImage") as Class; на него не ссылаются напрямую, поэтому он не включается.

При выборе второго варианта включаются все классы в .swc, и затем работает getDefinitionByName().

1 голос
/ 24 марта 2011

Посмотрите flash.utils.getDefinitionByName () или loaderInfo. applicationDomain.getDefinition () , если ресурсы готовы / загружены.

например

import flash.utils.getDefinitionByName;

var Image:Class = getDefinitionByName(msgObj.image) as Class;
this.addChild(new Image());

HTH

...