3

私はActionScriptの世界に不慣れで、自分にとって難しい問題にぶつかりました。ソースから再コンパイルできないクラスがいくつか含まれているSWFファイルがありますが、別のプロジェクトで再度使用したいと考えています。SWCファイルには、簡単に再利用できるコンパイル済みクラスが含まれていることがわかります。私の質問は、既存のSWFファイルをSWCファイルに変換して、通常のライブラリとして使用できるようにするにはどうすればよいですか?Googleは私を助けませんでした。

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ないため、コンパイル時にクラスにアクセスする必要がない場合は、を使用することをお勧めします。

[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 に答える