0

メイン ムービーに swf ファイルをロードしました。子供が遊び終わったら、つまり最終フレームに到達したら、swf をアンロードしたいと思います。このコードに追加できるビットを誰か教えてもらえますか?

//start button

start_button_aboriginal.addEventListener(MouseEvent.CLICK, fl_ClickToLoadUnloadSWF_3,false,0,true);

import fl.display.ProLoader;
var fl_ProLoader_3:ProLoader;

var fl_ToLoad_3:Boolean = true;

function fl_ClickToLoadUnloadSWF_3(event:MouseEvent):void
{
//ADDED APR02 START
    fl_ProLoader_3.contentLoaderInfo.addEventListener(Event.INIT, childInitHandler);
    fl_ProLoader_3.load(new URLRequest("myths/myth_aboriginal.swf"));
//ADDED APR02 END

if(fl_ToLoad_3)
{
    fl_ProLoader_3 = new ProLoader();
    fl_ProLoader_3.load(new URLRequest("myths/myth_aboriginal.swf"));
    addChild(fl_ProLoader_3);
    fl_ProLoader_3.x = 114;
    fl_ProLoader_3.y = 41;
}
else
{
removeChild(fl_ProLoader_3);
fl_ProLoader_3.unloadAndStop();
fl_ProLoader_3 = null;
}
// Toggle whether you want to load or unload the SWF
fl_ToLoad_3 = !fl_ToLoad_3;

 }
4

2 に答える 2

2

あなたは出来る

1) MovieClip クラスで定義されている文書化されていない addFrameScript 関数を使用して、子 SWF の最後のフレームにコールバックを配置します。ロードした SWF のコードを制御できない場合に便利です。

addFrameScript() には次の署名があります。

addFrameScript(frameNumber, callback); //frameNumber is zero-based (unlike in the Flash authoring suite, here you would enter 0 to refer to the first frame, and 1 for the second.)

親 SWF で、次を追加します。

function fl_ClickToLoadUnloadSWF_3(event:MouseEvent):void {
    ...
    fl_ProLoader_3.contentLoaderInfo.addEventListener(Event.INIT, childInitHandler);
    fl_ProLoader_3.load(new URLRequest("myths/myth_aboriginal.swf"));
    ...
}

function childInitHandler(event:Event):void {
    MovieClip(fl_ProLoader_3.content).addFrameScript(MovieClip(fl_ProLoader_3.content).totalFrames-1, unloadChild);
}

function unloadChild() {
    fl_ProLoader_3.unloadAndStop();
}

addFrameScript がなくなることを心配している場合でも、気にしないでください。タイムラインにコードを配置すると、すべてのコードがドキュメント クラスの関数に実際にコンパイルされ、addFrameScript によってフレーム リスナーが追加されます。

関数unloadChild()を定義することを忘れないでください。

function unloadChild():void {
    fl_ProLoader_3.unloadAndStop();
}

-また-

2) 最終フレームに到達したときに、ロードされた SWF からイベントをディスパッチします。

子 SWF の最後のフレーム:

this.dispatchEvent(new Event("lastFrameReached"));

親 SWF に、次を追加します。

fl_ProLoader_3.content.addEventListener("lastFrameReached", unloadChild);

-また-

3) 子の ENTER_FRAME イベントをサブスクライブし、子が最後のフレームにあるかどうかを確認します。

親 SWF に、次を追加します。

fl_ProLoader_3.content.addEventListener(Event.ENTER_FRAME, checkIfEnded);

function checkIfEnded(event:Event):void {
    if (fl_ProLoader_3.content.currentFrame == fl_ProLoader_3.content.totalFrames) {
        unloadChild();
    }
}

私は個人的に addFrameScript を好みます - 私にはよりクリーンなソリューションのようです。コールバックは 1 回実行されます。ポーリングする必要はなく、子 SWF を変更する必要もありません。

于 2013-03-29T16:36:03.540 に答える
0

これを解決するにはいくつかの方法があり、何度も尋ねられてきました...

とはいえ、子 SWF にイベント リスナーを作成せずにこれを解決する方法の 1 つは、現在のフレームの子 SWF を定期的にチェックすることです。それが swf の最後のものである場合は、unload メソッドを呼び出します。

// once every second, indefinitely.
var tick:Timer = new Timer(1000, 0);
tick.addEventListener(TimerEvent.TIMER, checkSWF);
tick.start();

//Load something to the stage.
var loader:Loader = new Loader();
loader.load(new URLRequest("child.swf")); 
addChild(loader);


function checkSWF(e:Event):void {
    if (loader.content.currentFrame == loader.content.totalFrames) {
        tick.stop(); // stop the timer
        loader.unloadAndStop();
    }
}
于 2013-03-29T16:08:19.950 に答える