トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     Loader.unload()後にロードしたswfのタイムラインscriptが実行される
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
vader
Åê¹ÆNo.43994
投稿日時: 2009-11-22 23:33
半人前
居住地: 東京
投稿: 38
使用環境:
MacOS10.4,FlashCS3
MacOS10.6,FlashCS4
Loader.unload()後にロードしたswfのタイムラインscriptが実行される
いつも楽しく拝見させて頂いております。
Mac OS X10.4.11, Flash CS3, actionscript3.0で作成しております。

色々と自分で調べてみたのですが、解決できなかったので、
質問させて下さい。

簡単に説明致しますと、Loader.unload()後にロードしたswfの
タイムラインに記述したscriptが実行されてしまうのです。

以下、問題を単純化するため、余計な部分を省いたスクリプトです。


///// parent.fla ロードする側のファイルです。
// メインタイムライン1フレーム目に記述
var child_mc:MovieClip;
var loader:Loader = new Loader();
var file_url:URLRequest = new URLRequest("load.swf");
loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
loader.load(file_url);

function initHandler(evt:Event):void {
	loader.contentLoaderInfo.removeEventListener(Event.INIT, initHandler);
	addChild(loader);
	child_mc = MovieClip(loader.content);
}

stage.addEventListener(MouseEvent.CLICK, remover);

function remover(evt:MouseEvent):void {
	loader.unload();
	child_mc = null;
	trace("loader = ", loader, "loader.content =", loader.content, "child_mc = ", child_mc);
}



///// load.fla ロードされる側のファイルです。
// メインタイムライン30フレーム目に記述
trace("あああ");


処理の流れとしては、
parent.swfから、load.swfをロードしています。
すると、load.swf記述したtrace()が30フレーム毎に出力されます。

次にステージをクリックするとloader.unload()を実行します。
trace()でloader.contentとその参照を取得したchild_mcが
nullと出力されます。

しかし、load.swfのタイムラインのtrace()は止まりません。

もちろん、loader.unload()の前に
MovieClip(loader.content).stop();
と記述すれば、trace()が止まることは解るのですが、
私が疑問に思うのは、ステージからも削除され、参照もnullを
返すのになぜタイムラインに記述したスクリプトが実行される
のかという点です。

これは、こういった仕様なのでしょうか?
それとも、私の書いているスクリプトがおかしいのでしょうか?

ひょっとして、常識的なことを聞いているかも知れませんが、
どなたか、ご教授頂けないでしょうか?
何卒、宜しくお願い申し上げます。



野中文雄
Åê¹ÆNo.43995
投稿日時: 2009-11-23 0:53
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: Loader.unload()後にロードしたswfのタイムラインscriptが実行される
インスタンスが直ちには削除されず、ガベージコレクションを待たなければならないということではないでしょうか。Loader.unload()でなく、Loader.unloadAndStop()メソッドを用いればよさそうです。
引用:
vaderさんは書きました:
簡単に説明致しますと、Loader.unload()後にロードしたswfの
タイムラインに記述したscriptが実行されてしまうのです。

以下、問題を単純化するため、余計な部分を省いたスクリプトです。
///// parent.fla ロードする側のファイルです。
// メインタイムライン1フレーム目に記述
var child_mc:MovieClip;
var loader:Loader = new Loader();
var file_url:URLRequest = new URLRequest("load.swf");
loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
loader.load(file_url);

function initHandler(evt:Event):void {
	loader.contentLoaderInfo.removeEventListener(Event.INIT, initHandler);
	addChild(loader);
	child_mc = MovieClip(loader.content);
}

stage.addEventListener(MouseEvent.CLICK, remover);

function remover(evt:MouseEvent):void {
	loader.unload();
	child_mc = null;
	System.gc();
	trace("loader = ", loader, 
	"loader.content =", loader.content, 
	"child_mc = ", child_mc);
}

///// load.fla ロードされる側のファイルです。
// メインタイムライン30フレーム目に記述
trace("あああ");


----------------
 

vader
Åê¹ÆNo.43999
投稿日時: 2009-11-23 18:53
半人前
居住地: 東京
投稿: 38
使用環境:
MacOS10.4,FlashCS3
MacOS10.6,FlashCS4
Re: Loader.unload()後にロードしたswfのタイムラインscriptが実行される
野中先生、

お忙しい中、アドバイスを頂き、誠にありがとうございます。

お教え頂いたLoader.unloadAndStop()は、FlashPlayer10から
対応のようですね。
最近、自宅をCS4にしたので、今度試してみたいと思います。

あれから、私自身でもさらに問題を絞り込んで検証を繰り返した結果、
私がactionscript3.0において、重要な勘違いをしていたことに
気付くことができました。

当初、この問題において、Loader.unload()を疑っていました。
これは、FlashPlayer9においては、Loader.contentをaddChild()
した場合に、Loader.unload()が実行できないという不具合を
先に経験していたからです。

しかし、検証した結果、Loader.unload()に限った問題では
ありませんでした。
以下が検証に使用したスクリプトです。


///// test.fla /////
// メインタイムライン1フレーム目に記述
stage.addEventListener(MouseEvent.CLICK, remover);

function remover(evt:MouseEvent):void {
	removeChild(child_mc);
	child_mc = null;
	trace("child_mc = ", child_mc);
}



///// child_mc ///// test.flaのメインタイムラインに配置
// 30フレーム目に記述
trace("あああ");


上記スクリプトを実行すると、30フレーム毎にtrace()が出力
されます。
ステージをクリックすると、child_mcがステージから削除され、
child_mcの参照がnullと返されます。
しかし、child_mcのtrace()出力は止まりません。

今まで私は、ステージから削除し、参照がnull(参照カウントが0)
であれば、タイムラインは削除され、タイムラインに記述した
スクリプトの実行も止まると勘違いしておりました。

actionscript3.0に移行して、1年以上経ちますが、今まで何故
気付かなかったのか、本当にお恥ずかしい限りです。

今回の問題で、いかに自分が未熟者であるか理解出来たので、
野中先生の本を読んで、精進したいと思います。
本当にありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops