2012-10-22 55 views
3

我是新來的ActionScript世界,我遇到了一個困難的問題。我有一個SWF文件,其中包含一些我無法從源重新編譯,但又想在其他項目中再次使用的類。我看到SWC文件包含可以輕鬆重用的編譯類。我的問題是如何將現有的SWF文件轉換爲SWC文件,以便我可以將其用作常規庫?谷歌沒有幫助我。如何將現有的SWF文件轉換爲SWC以用作庫?

+0

您可以將代碼編譯爲SWC而不是SWF! – Florent

+0

@Florent我寫道,我無法從源代碼重新編譯SWF。我甚至反編譯它,並嘗試重新編譯,但反編譯器生成不可編譯的代碼。 – jabal

+0

你的意思是你既沒有源代碼也沒有FLA? – Florent

回答

3

SWC文件使用ZIP壓縮,實際上包含SWF。如果將文件擴展名從.swc更改爲.zip,則可以瀏覽內容和目錄結構。它看起來像這樣:

foobar.swc 
    -> catalog.xml 
    -> library.swf 

隨着一些逆向工程,你也許可以通過建立catalog.xml文件和ZIP文件一起打包他們創造從SWF一個SWC。

但這似乎相當複雜!您還可以使用Loader將外部SWF加載到您自己的SWF中。外部SWF的所有類,符號和時間線都將可用。當然,這會產生運行時間依賴性。

1

由於您無法將代碼重新編譯到SWC,因此如果您不需要在編譯時訪問這些類,則建議您使用Loader

[Event(name="complete", type="flash.events.Event")] 
public class SWFLibrary extends EventDispatcher 
{ 
    private var loader:Loader; 
    private var loaded:Boolean; 

    public function SWFLibrary(urlOrBytes:*) 
    { 
     super(); 

     loader = new Loader(); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 

     if (urlOrBytes is String) { 
      loader.load(new URLRequest(urlOrBytes)); 
     } else if (urlOrBytes is URLRequest) { 
      loader.load(urlOrBytes); 
     } else if (urlOrBytes is ByteArray) { 
      loader.loadBytes(urlOrBytes); 
     } else { 
      throw new ArgumentError("Invalid urlOrBytes argument"); 
     } 
    } 

    public function getAssetClass(className:String):Class 
    { 
     if (!loaded) { 
      throw new IllegalOperationError("The SWF library isn't loaded"); 
     } 

     return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class; 
    } 

    private function completeHandler(event:Event):void 
    { 
     loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler); 
     loaded = true; 

     dispatchEvent(new Event(Event.COMPLETE)); 
    } 
}