0

我有一个包含 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 对象的错误。谢谢你的帮助。

4

3 回答 3

1

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

例如

import flash.utils.getDefinitionByName;

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

高温高压

于 2011-03-23T22:48:45.883 回答
1

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

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

另一种选择是使用该[embed]功能而不是使用 swc 加载它们,这样可以保证它们已编译并且可以随时调用。

于 2011-03-24T04:05:19.077 回答
1

在 FlashDevelop 4.0.1(不确定旧版本)中,右键单击 .swf 文件。“添加到库”选项的正下方是“选项”。而不是“库(包含引用的类)”选择“包含库(完全包含)”。

似乎在第一个选项中,当直接调用类时,就像new BackgroundImage();引用了 Class 一样,因此它被包含在内。当使用它调用类时var backgroundImage:Class = getDefinitionByName("BackgroundImage") as Class;没有直接引用,因此不会被包含在内。

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

于 2012-03-15T05:44:16.393 回答