2

swc ビルドの結果の swf を手動で読み込もうとしています。私の環境では、出力 swfs から冗長なコードを削除するために、クラス定義を swcs に分離する必要があります (意味がある場合)。

LibA一言で言えば、私が構築している swf でクラス ( ) を定義していcompcます。私はそれをswcとディレクトリ形式の両方にコンパイルしているので、ディレクトリからlibrary.swfを簡単に抽出して実行時にロードし(外部リンケージ)、swcを使用してFlash CS5またはmxmlc.

LibA.as :

package
{
    public class LibA
    {
        public function LibA()
        {
            trace("*** LibA()");
        }
    }
}

Main.as :

package
{
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;

    public class Main extends Sprite
    {
        private var self:Main;
        private var context:LoaderContext;

        public function Main()
        {
            var l:Loader = new Loader();
            self = this;

            l.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event) {
                self.addChild(l.content);

                var liba:LibA = new LibA();
            });
            l.load(new URLRequest("./libs/build/liba.swf"));
        }
    }
}

swc/directory swc をビルドします

compc -output libs/build/liba.swc -include-sources libs/LibA.as -debug=true

ビルド時に Flash CS5 の AS3 設定で適切なリンクを設定しますMain(ステージに直接リンクされたクラス)。

すべて問題なく発行されます。

ただし、実行時に取得しますVerifyError: Error #1014: Class LibA could not be found.

ここで何が欠けていますか?liba.swf内で定義されたクラスを my から読み込んで使用できるようにしたいMain.swf

完全なトレース ダンプ:

verify Function/<anonymous>()
                        stack:
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  0:getlex 4
                        stack: Main?
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  2:getlex 7
                        stack: Main? flash.display::Loader?
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  4:getproperty content
                        stack: Main? flash.display::DisplayObject?
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  6:callpropvoid addChild 1
                        stack:
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  9:findpropstrict LibA
                        stack: Object
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  11:constructprop 10 0
                        stack: *
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  14:coerce LibA
VerifyError: Error #1014: Class LibA could not be found.
4

2 に答える 2

2

SWFからクラスをロードする場合は、(イベントハンドラーで)次のようなことを行う必要があります。

var li:LoaderInfo = e.target as LoaderInfo; // get the loaderInfo object from the event
var swf:MovieClip = li.loader.content as MovieClip; // get the swf
var c:Class = swf.loaderInfo.applicationDomain.getDefinition( "LibA" ) as Class; // get the class definition for LibA

新しいものを作成すると、オブジェクトcが得られますLibA。名前として完全なクラス定義が必要になります。

あなたがやろうとしていることを理解していれば、外部ライブラリを埋め込むようにSWCを設定できると確信しています。つまり、コードは完了しますが、クラスは含まれず、SWCが検索されます。実行時。

編集

あなたがしているようなことを試してみてください。上記の私の例では、を作成するときにc、それをトレースすると、トレースされますLibA。ただし、明示的に参照すると、説明したエラーが発生します。LibAこれは、Flashが本質的に2つの定義(参照されたものとロードしているもの)と混同されているためだと思います。これらは2つの異なるアプリケーションドメインにあります。

修正は@turbosqelが説明しているとおりで、LoaderContextオブジェクトをロードします。

var l:Loader = new Loader();
var context:LoaderContext = new LoaderContext( false, ApplicationDomain.currentDomain );
l.contentLoaderInfo.addEventListener(Event.COMPLETE, this._onLoadComplete );
l.load(new URLRequest("./libs/build/liba.swf"), context);

これは私にとってはうまくいき、LibAクラスを明示的に参照できるようになりました。

于 2012-01-17T00:25:28.397 に答える
0

libaは、mainにインポートしていないため、SWFがロードされるまで存在しません。

つまり、コンパイル時にそれは存在しません

var liba:LibA = new LibA();ロードされたswfルートの関数呼び出しに移動し、ロード後に関数を呼び出しますe.currentTarget.someFunc

于 2012-01-17T00:24:46.913 に答える