8

fla にたくさんのグラフィック アセットがあり、MovieClips はいくつかのクラスにリンクされています。fla を swc としてエクスポートし、「コードにマージ」オプションを使用してライブラリに追加します。

このようにクラスを呼び出すだけで、 MovieClips のインスタンスを作成できます。

     //example 1
     var newMc:BaseClass = new GraphicAsset();

次のことをしたい場合、Flash はエラーをスローします。GraphicsAssetClass は null です。

    //example 2
    var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

上記の行を機能させる唯一の方法は、これを行うことです

    //example 3
    var newMc:GraphicAsset;
    var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

    //then I'm able to do this 
    var newMc:BaseClass = new GraphicsAssetClass();

例 2 のように getDefinitionByName() を呼び出してクラスを簡単に取得できるソリューションを考えてみてください。例 3 のソリューションに頼る必要はありません。

4

2 に答える 2

11

問題は、コードのどこかで直接参照されていないクラスがコンパイラによって除外されることです。これは、コンパイラが設計により適用する最適化です。

これを回避する通常の方法は、「例 3」で示したとおりです。ただし、2 つの線が同じ場所にある必要はないことに注意することが重要です。に限って

var newMc:GraphicAsset;

実行のメイン パスから参照されている SWF のどこかにある場合、クラス定義GraphicAssetは最終的な swf に含まれます。その後、あなたは呼び出すことができます...

var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

まったく別の場所から、期待どおりに動作します。

別々のSWFで 2 つの行を見つけることさえ可能です (そして非常に一般的です) 。この場合、実行時に一方の swf が他方の swf をロードします。通常、ローダswf は を使用するものgetDefinitionByName("SomeClass)であり、ロードされたswf は を定義しclass SomeClass、 を使用var a:SomeClass;してクラスが確実に swf に組み込まれるようにするものです。

このため、「ライブラリ swf」で定義され、その swf のメイン ムービー クリップから参照される「MyLibraryManifest」などと呼ばれるクラスをよく見かけます。「マニフェスト」クラスは、次のようになります。

class MyLibraryManifest {

   private var a:GraphicAsset;
   private var b:SomeClass;
   private var c:SomeOtherClass;

   //... and so on...

}

[編集]上記の「プルーニング最適化」を適用せずに、リンカーに 1 つまたは複数の個々のクラス (または swc 全体) を強制的に含めるために、コンパイラに-includesor-include-librariesオプションを使用できます。mxmlc

mxmlc コマンド ライン オプションの説明については、adobe のサイトを参照してください。

オプションは構成ファイルで指定することもできます。これにより、flex や Flash IDE が舞台裏でコンパイラを呼び出す方法を制御できます。

幸運を!

于 2010-11-05T05:13:56.160 に答える
1

FlashDevelop を使用すると、これを簡単に修正できます。

プロジェクト リストから、含まれている swc を右クリックします。オプションを選択してから、「ライブラリを含める(完全なライブラリ)」を選択します。

..getDefinitionByName を使用して、swc ファイルから参照されていないクラスを取得できるようになりました。

于 2012-02-21T08:13:15.393 に答える