2010-03-09 84 views
1

我想在Flash/Flex中執行一個非常簡單的應用程序,該應用程序將嵌入swf本身的圖像加載並顯示出來。事情是我正在嘗試使用命令行(mxmlc和compc),而不使用@Embed,並且失敗悲慘。對Flex中SWC的「鏈接」

我有一個非常簡單的Main.as:

package 
{ 
    import flash.display.*; 
    import flash.utils.*; 

    public class Main extends Sprite 
    { 
     public function Main() : void 
     { 
      var pDef:Class = getDefinitionByName("icon_big.png") as Class; 
      var _image:BitmapData = new pDef(0, 0); 

      var pSprite:Sprite = new Sprite();   
      pSprite.graphics.beginBitmapFill(_image); 
      pSprite.graphics.drawRect(0, 0, _image.width, _image.height); 
      pSprite.graphics.endFill(); 

      addChild(pSprite); 
     } 
    } 
} 

如果我添加icon_big.png到使用Flash IDE圖書館這工作得很好,但我無法弄清楚如何從做命令行。

我使用compc命令把PNG一個SWC裏面:

compc --include-file icon_big.png icon_big.png -output assets.swc 

這會產生一個17 kb的Assets.swf中,比icon_big.png稍大。然後我嘗試編譯和鏈接Main.as:

mxmlc -include-libraries+=assets.swc Main.as 

這將產生一個944字節的main.swf,這顯然不包括資產,並在運行時出現故障。

根據我發現的mxmlc文檔,-include-libraries應該鏈接到每個類,包括那些沒有被代碼直接引用的類(這裏就是這種情況,因爲我從代碼中獲取類),而且它毫不奇怪,在運行時失敗。

請注意,在Flash項目中使用相同的代碼(或者更確切地說相當等效的代碼) - 我不想修復代碼,但是無論Flash如何在內部執行命令行。

我覺得我只是「沒有得到」的東西......任何線索?

+0

只是爲了檢查:您的'compc'命令說'assets.swf',但您的'mxmlc'命令引用'assets.swc'。我假設這是一個錯字? – 2010-03-09 21:33:52

+0

是的。抱歉。我正在創建一個swc。我稱它爲swf並不重要,它仍然是一個swc。 – ggambett 2010-03-09 22:33:56

回答

0

我建議您從swftools.org下載swftools。一旦你有他們,運行:

 
    swfdump -D assets.swf 

採取特別是看它涉及到SWF標籤與值76(0x4C)輸出,稱爲SYMBOLCLASS

下面是一個導出類的一個實例,一個名爲IntegerMemberBySlot:

 
[04c]  24 SYMBOLCLASS 
        exports 0001 as "IntegerMemberBySlot" 

,您在您的Assets.swf中導出什麼符號?

+0

我正在創建一個swc,而不是swf - 不知道該怎麼做。我在swc裏面(在解壓之後)在library.swf上運行你的命令。有一個顯然與我的資產無關的SYMBOLCLASS。 因此,看起來我在創建swc時做了一些錯誤,而不是鏈接步驟 - 這是一個進步!那麼如何創建SWF(而不是SWC)呢?使用compc? mxmlc的? – ggambett 2010-03-09 22:32:23

0

你有沒有試着用mxmlc的編譯時添加到您的源路徑參數資產的路徑?

-source路徑./PATH/TO/ASSET

+0

是的 - 沒有區別。 – ggambett 2010-03-09 22:33:02

0

我認爲你需要嵌入一個類中的PNG圖像,然後編譯類爲SWC。我不認爲你可以像你想要的那樣直接將PNG放入SWC中,但我可能是錯的。

0

我也有類似的情況(大項目,圖形資源資源SWC),並且不管是什麼我想,我便無法獲得Flex中包括不直接從項目中引用的資產和類(我想包括不同皮膚,然後在運行時實例化正確的一個,具體取決於配置)。

最後,我發現一種解決方法通過,而不是靜態的swc的喜好,切換到運行時共享庫​​(的RSL)。基本上,flex在運行應用程序本身之前解壓縮swc,並在運行時加載和鏈接包含的swf。 swf中的所有類和資產都以這種方式加載。可能並不完全符合你的要求,但它適用於我。