-1

外部からロードされた一連の swfs のプロジェクターをまとめようとしていますが、私の一般的な質問はできるだけ短くします。

ロードされた外部 SWF ctrl(オーサリング中にステージに配置された MovieClip のインスタンス) の最初と最後のフレームに次のものが含まれている場合:

 dispatchEvent(new Event("FIRST_FRAME")); // in the first frame, and: 
 dispatchEvent(new Event("LAST_FRAME")); // in the last frame 

次に、それらのイベントを ctrl コンテナー内で「聞く」必要がありますか?

現在、「より高い」ではなく、ロードされたコンテンツ内のイベントのみをリッスンできるようです。つまり、ローダーの完全なリスナーで言うと:

mc:MovieClip = MovieClip(e.currentTarget.content);
mc.addEventListener("LAST_FRAME", function(){ // something });

その後、イベントが聞こえますが、私が言うときは聞こえません:

ctrl.addEventListener("LAST_FRAME", function(){ // something });

後者はより堅牢なようですので、私はそれを機能させるのに苦労していますが、私はいくつかの教訓を逃していると思います;-) 誰かがこれを経験しましたか? 私のアプローチは正しいですか、それとも別の道をたどるべきですか?

みんなで乾杯。

4

1 に答える 1

0

crtlイベントをディスパッチするときにバブルオプションをtrueに設定することで、外部swfからディスパッチされたイベントを表示オブジェクトに受信させることができます。SWFB.swfがSWFA.swfにロードされる次の例を見てください。

SWFB:

package swfb
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            const SECOND:int = 1000;

            var timer:Timer = new Timer(5 * SECOND, 1);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
            timer.start();

        }// end function

        private function onTimerComplete(e:TimerEvent):void
        {
            dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE, true, true));

        }// end function

    }// end class

}// end package

SWFA:

package swfa
{
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.net.URLRequest;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
            loader.load(new URLRequest("swf/SWFB.swf"));


        }// end function

        private function onLoaderComplete(e:Event):void
        {
            var loaderInfo:LoaderInfo = LoaderInfo(e.target);

            var container:Sprite = new Sprite();
            container.addChild(loaderInfo.content);
            container.addEventListener(TimerEvent.TIMER_COMPLETE, onContainerTimerComplete);
            addChild(container);

        }// end function

        private function onContainerTimerComplete(e:TimerEvent):void
        {
            trace("TIMER COMPLETE!");

            e.stopPropagation();

        }// end function

    }// end class

}// end package

SWFB.swfはTimer、ステージに追加されてから5秒後にイベントをディスパッチします。イベントをディスパッチすると、バブルとキャンセル可能なオプションがtrueに設定されます。

SWFA.swfでは、SWFB.swfがロードされてから、と呼ばれる表示オブジェクトコンテナに追加されますcontainerTimer次に、ディスパッチされるSWFB.swfからのイベントをリッスンするイベントリスナーがコンテナーに追加されます。ディスパッチされると、onContainerTimerComplete()イベントハンドラーはTimerイベントのstopPropagation()メソッドを呼び出して(その名前が示すように)イベントの伝播を停止します。

于 2011-05-29T15:19:28.377 に答える