1

Loaderクラスを使用して1つのswfを別のswfにロードしていますが、子swfのロードが終了して表示リストに追加されると、そのドキュメントクラスはインスタンス化されません。オブジェクトの作成時に実行する必要のあるトレースステートメントがいくつかありますが、親SWFにロードしても何も起こりません。子SWFを単独でコンパイルすると、ドキュメントクラスは期待どおりに実行されます。

だから私は疑問に思っています...子SWFのドキュメントクラスをどのように関連付けるのLoader.contentですか?

以下の岸のソリューションで更新されたコード。

public class Preloader extends Sprite {
    import flash.net.*;
    import flash.display.*;
    import flash.events.*;

    // code in parent SWF's Document Class (Preloader.as)
    private var swfLoader:Loader;
    public var mainMovie:MovieClip;

    public function Preloader(){   
        swfLoader = new Loader();
        swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderDone);
        swfLoader.load(new URLRequest("mainmovie.swf"));
    }

    private function loaderDone(e:Event):void {
        // Cast Loader.content to MovieClip
        mainMovie = MovieClip(swfLoader.content);

        mainMovie.addEventListener(Event.ADDED_TO_STAGE, mainMovieAddedListener);

        addChildAt(mainMovie, 0);

    }
    private function mainMovieAddedListener(e:Event):void {
       // init() not necessary
    }
}

// MainMovie.as runs after casting swfLoader.content to MovieClip

public class MainMovie extends Sprite {

    public function MainMovie(){
        trace('MainMovie WHATTUP'); 
    }

    public function init():void {
        trace('init'); 
    }
}

乾杯!

4

3 に答える 3

3

問題は、swfインスタンスにアクセスしようとしている方法です。

まず、ドキュメントクラスインスタンスはローダーコンテンツプロパティによって参照されます。あなたはそれをこのように参照するでしょう:

var swf:DisplayObject = swfLoader.content;

ただし、それでも、DisplayObject自体の一部ではないカスタムプロパティを使用しようとしているため、 DisplayObjectを実際のクラス(この場合はMainMovie)または動的クラス(MovieClipなど)のいずれかにキャストする必要があります。 。したがって、次のようにMainMovie.init()を呼び出すことができます。

var swf:MovieClip = MovieClip(swfLoader.content);
swf.init();

お役に立てば幸いです。

于 2010-05-03T17:06:11.537 に答える
1

mainMovieをステージに追加してから、それを開始するリスナーを追加します。映画がステージに上がった後に追加されるため、イベントは発生しません。

于 2010-05-03T09:17:48.593 に答える
0

Cristiが言ったことは、initメソッドが起動しないという理由でおそらく正しいですが、さらに奇妙な問題は、ロードされた子swfのコンストラクターであるMainMovieが、そのオブジェクトが作成されるとすぐに起動する必要があることです。

このようなことをしたときはいつでも、ロードされたswfのコンテンツから新しいSpriteオブジェクトを作成したことはありません。そこで行っているのは、BitmapDataのようにswfを使用して、SpritemainMovieを作成しているようです。

これを試してください:と言うステートメントを削除しswfLoader = null、代わりにと言いaddChild(swfLoader);ます。それでもそのイベントリスナーがステージに追加されていることを確認したい場合は、実行する前にそれをaddChild(swfLoader);配置し、もちろんmainMovieオブジェクトではなくswfLoaderに配置します。

swfLoader.addEventListener(Event.ADDED_TO_STAGE, mainMovieAddedListener);
addChild(swfLoader);

あなたがそれから得るものを見てください。[また、initにアクセスしようとしたときに発生した正確なエラーを貼り付けることはできますか?]

デブ

于 2010-05-03T10:32:01.040 に答える