2011-03-23 67 views
0

我有一个SWC其中包含8个精灵,每一个具有与模式Icon01,Icon02等链接标识符我可以做的事情创建这些精灵的一个实例形式的Flash AS3 SWC附加符号

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对象的错误。谢谢你的帮助。

回答

1

getDefinitionByName(msgObj.image)将要走的路,但你需要引用每个你可能会调用某个地方,否则它不会编译的类。

我在这种情况下做的是创建一个虚拟函数,它永远不会被调用并列出所有的类,这样你就可以强制编译器包含它。

另一种选择是,这些使用[embed]功能,而不是使用SWC加载,这样保证了它们被编译并可以在任何时候被调用的方式。

1

看看flash.utils.getDefinitionByName()或loaderInfo。 applicationDomain.getDefinition(),如果资产已准备就绪/已加载。

例如

import flash.utils.getDefinitionByName; 

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

HTH

+0

感谢您的建议。这使我更接近我想要的东西,但是,在它正常工作之前,我必须定义每种类型图像的变量(例如var i:Image01)。是否可以按照上面概述的方式附加资产,而不必首先声明变量类型? – 2011-03-23 23:11:52

+0

@Matt当你使用getDefinitionByType时,你得到了一个你可以实例化的类的引用。我不确定你的意思是“不必首先声明变量类型”。您添加到显示列表的所有内容都是DisplayObject(例如MovieClip,Bitmap等) – 2011-03-23 23:18:32

1

在FlashDevelop中4.0.1(不知道老版本),右键点击.swf文件。在'添加到图书馆'的选项下面是'选项'。而不是'图书馆(包括被引用的类)'选择'包括的图书馆(包括完全)'。

看来,第一个选项,直接调用类如new BackgroundImage();类被引用,所以它被包括在内。当用var backgroundImage:Class = getDefinitionByName("BackgroundImage") as Class;调用该类时,它不会被直接引用,因此不会被包含。

通过选择第二个选项,将包含.swc中的所有类,然后getDefinitionByName()可以工作。