我有一个包含8个精灵的SWC,每个精灵都有一个带有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对象的错误。谢谢你的帮助。
答案 0 :(得分:1)
如果资产已准备好/已加载,请查看flash.utils.getDefinitionByName()或loaderInfo。applicationDomain.getDefinition()。
e.g。
import flash.utils.getDefinitionByName;
var Image:Class = getDefinitionByName(msgObj.image) as Class;
this.addChild(new Image());
HTH
答案 1 :(得分:1)
getDefinitionByName(msgObj.image)
将是可行的方法,但你需要引用你可能在某处调用的每个类,否则它将不会被编译。
我在这种情况下所做的是创建一个永远不会被调用的虚函数,并列出那里的所有类,这就是强制编译器包含它的方式。
另一种选择是使用[embed]
功能而不是使用swc来加载这些功能,这样就可以保证它们被编译并且可以随时调用。
答案 2 :(得分:1)
在FlashDevelop 4.0.1中(不确定旧版本),右键单击.swf文件。 “添加到库”选项正下方是“选项”。而不是'库(包含引用的类)'选择'包含的库(完全包括)'。
看来,使用第一个选项,当直接调用类new BackgroundImage();
时,类被引用,因此它被包含在内。当使用var backgroundImage:Class = getDefinitionByName("BackgroundImage") as Class;
调用类时,它不会直接引用,因此不会包含它。
通过选择第二个选项,可以包含.swc中的所有类,然后getDefinitionByName()
就可以了。