3

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

4

2 回答 2

3

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

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

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

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

于 2012-10-22T21:45:11.100 回答
1

由于您无法将代码重新编译为 SWC,Loader因此如果您不需要将类作为编译时访问,我建议您使用 a。

[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));
    }
}
于 2012-10-23T09:58:42.437 回答