2011-03-23 63 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()可以工作。