如何将现有SWF文件转换为SWC以用作库?

时间:2012-10-22 21:29:36

标签: actionscript-3 flash swc

我是ActionScript世界的新手,我遇到了一个对我来说很难的问题。我有一个SWF文件,其中包含一些我无法从源代码重新编译但又想在不同项目中再次使用的类。我看到SWC文件包含可以轻松重用的编译类。我的问题是如何将现有的SWF文件转换为SWC文件,以便将其用作常规库?谷歌没有帮助我。

2 个答案:

答案 0 :(得分:3)

SWC文件使用ZIP压缩,实际上包含SWF。如果您将文件扩展名从.swc更改为.zip,则可以浏览内容和目录结构。它看起来像这样:

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

通过一些逆向工程,您可以通过构建catalog.xml文件并将它们打包在ZIP文件中来从SWF创建SWC。

但这似乎相当复杂!您也可以使用Loader将外部SWF加载到您自己的SWF中。然后,外部SWF的所有类,符号和时间轴都将可用。当然,这会产生运行时依赖性。

答案 1 :(得分: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));
    }
}