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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     MovieClip.loadMovie 後の挙動について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
kokoo
Åê¹ÆNo.33995
投稿日時: 2007-7-4 13:22
新米
居住地:
投稿: 5
使用環境:
Windows XP Professional SP2
Flash MX Professional 2004 (7.2)
MovieClip.loadMovie 後の挙動について
こんにちは。
MovieClip の loadMovie メソッドですが、loadMovie が完了した後は、ムービークリップのインスタンスに設定されていた
プロパティやメソッドはクリアされてしまうものだと思っていました。
ですが下記のような単純なサンプル(_root タイムラインに test_mc というムービークリップを配置してプロパティ設定後、test.swf というファイルを test_mc に読み込む)で試したところ、プロパティやメソッドはクリアされずに保持したままでした。

どうしてでしょうか?
勘違いや間違いをしていると思うので、教えていただければ幸いです。
よろしくお願いします。

---------- スクリプト始まり -----------
-- _root の frame 1 のフレームスクリプト
// プロパティ設定
this.test_mc._alpha = 50;
this.test_mc.hoge = "fugafuga";
// メソッドも設定
this.test_mc.SayHello = function() { return "Hello"; }

// トレース
trace("[before]");
trace("_alpha: " + this.test_mc._alpha);
trace("hoge: " + this.test_mc.hoge);
trace("SayHello:" + this.test_mc.SayHello());

// ムービー読み込み
this.test_mc.loadMovie("test.swf");

// 再度トレース
trace("[after]");
trace("_alpha: " + this.test_mc._alpha);
trace("hoge: " + this.test_mc.hoge);
trace("SayHello:" + this.test_mc.SayHello());

---------- スクリプト終わり -----------
---------- 出力結果始まり -----------
[before]
_alpha: 50
hoge: fugafuga
SayHello:Hello
[after]
_alpha: 50
hoge: fugafuga
SayHello:Hello

---------- 出力結果終わり -----------

環境
Windows XP SP2
Flash MX 2004
Yoshiki Okawa
Åê¹ÆNo.33996
投稿日時: 2007-7-4 15:01
新米
居住地: Christchurch, NZ
投稿: 13
使用環境:
Windows 7 Professional
Flex SDK 4.0
Re: MovieClip.loadMovie 後の挙動について
引用:
プロパティやメソッドはクリアされずに保持したままでした。

ではなく、loadMovieの直後にはまだswfファイルがロードされていないからです。直後に、trace(this.test_mc.getBytesTotal());をしてみてください。おそらく0が出力されます。
これを回避するには、setIntervalでthis.test_mc.getBytesTotal()==this.test_mc.getBytesLoaded()とthis.test_mc.getBytesTotal()>0を調べるしかないかと思われます。
上記の理由よりloadMovieより、MovieClipLoaderと、onLoadInitを使用するのが良いかと思われます。
詳しくは、
こちら(テクニカルノート)


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

kokoo
Åê¹ÆNo.34000
投稿日時: 2007-7-4 16:54
新米
居住地:
投稿: 5
使用環境:
Windows XP Professional SP2
Flash MX Professional 2004 (7.2)
Re: MovieClip.loadMovie 後の挙動について
Yoshikiさん、ありがとうございます。

引用:
ではなく、loadMovieの直後にはまだswfファイルがロードされていないからです。
(略)
上記の理由よりloadMovieより、MovieClipLoaderと、onLoadInitを使用するのが良いかと思われます。


おっしゃる通り loadMovie の直後だったからでした。
教えていただいたように MovieClipLoader クラスと OnLoadInit メソッドを使うように書き換えてみたところ、自分で勝手に設定したプロパティ(hoge)やメソッド(SayHello)は期待通り undefined になっているのですが、組み込みの _alpha プロパティだけは元の値を保持したままになっています。
これはなぜなんでしょうか?

---------- スクリプト始まり -----------
-- _root の frame 1 のフレームスクリプト
// プロパティ設定
this.test_mc._alpha = 50;
this.test_mc.hoge = "fugafuga";
// メソッドも設定
this.test_mc.SayHello = function() { return "Hello"; }

// トレース
trace("[before]");
trace("_alpha: " + this.test_mc._alpha);
trace("hoge: " + this.test_mc.hoge);
trace("SayHello:" + this.test_mc.SayHello());

// ムービー読み込み
var listener:Object = new Object();
listener.onLoadInit = function(target_mc:MovieClip)
{
	trace("[after]");
	trace("_alpha: " + target_mc._alpha);
	trace("hoge: " + target_mc.hoge);
	trace("SayHello:" + target_mc.SayHello());
}
var loader_mcl:MovieClipLoader = new MovieClipLoader();
loader_mcl.addListener(listener);
loader_mcl.loadClip("b.swf", this.test_mc);

/*
// 再度トレース
trace("[after]");
trace("_alpha: " + this.test_mc._alpha);
trace("hoge: " + this.test_mc.hoge);
trace("SayHello:" + this.test_mc.SayHello());
*/

---------- スクリプト終わり -----------
---------- 出力結果始まり -----------
[before]
_alpha: 50
hoge: fugafuga
SayHello:Hello
[after]
_alpha: 50
hoge: undefined
SayHello:undefined

---------- 出力結果終わり -----------
c-geru
Åê¹ÆNo.34001
投稿日時: 2007-7-4 17:55
職人
居住地: 文京区本郷
投稿: 209
使用環境:
10.6.8+ CS5.5
Win7+ CS4
Re: MovieClip.loadMovie 後の挙動について
引用:
自分で勝手に設定したプロパティ(hoge)やメソッド(SayHello)は期待通り undefined になっているのですが、組み込みの _alpha プロパティだけは元の値を保持したままになっています。
これはなぜなんでしょうか?

MovieClipに元々定義されているプロパティ(_alpha,_xなど「_」で始まるリファレンスに存在するもの)は、そのまま保持されているようですね。_alphaなどはMovieClipにクラスに定義され、ユーザが個別に定義したものはステージに配置されたインスタンスに定義されるからではないでしょうか。

_alphaだけでなく、_xscale,_yscaleでスケールを変更しても保持されます。
kokoo
Åê¹ÆNo.34004
投稿日時: 2007-7-4 21:49
新米
居住地:
投稿: 5
使用環境:
Windows XP Professional SP2
Flash MX Professional 2004 (7.2)
Re: MovieClip.loadMovie 後の挙動について
c-geruさん、ありがとうございます。

引用:
_alphaなどはMovieClipにクラスに定義され、ユーザが個別に定義したものはステージに配置されたインスタンスに定義されるからではないでしょうか。


これは微妙に納得がいかないのですが(すみません)、「_alpha などがMovieClipクラスに保存される」というプロトタイプベースの考え方に基づくと、MovieClipオブジェクトの _alpha プロパティにすべてのインスタンスがアクセスできてしまうわけで、オブジェクトの汚染が起こるはずだと思うんです。

ですがFlashはJavaScriptと違い、そういうことは起こっていないわけで、これがまた僕を悩ませているところです。
ということで悩んでも仕方ないので実験をしてみました。
1. _root のタイムラインで createEmptyMovieClip する
2. できたムービークリップのプロパティ( _ で始まるもの)をいじる
3. できたムービークリップに外部SWF(単にシンボルひとつ置いただけのもの)を読み込む

で、3の前後で trace したものを見比べたんですが、値が引き継がれているものとそうでないものがあり、やはり悩ましいかぎりです。

---------- スクリプト始まり -----------
-- _root の frame 1 のフレームスクリプト
this.createEmptyMovieClip("test_mc", this.getNextHighestDepth());

// プロパティ設定
this.test_mc._alpha = 50;
this.test_mc._focusrect = true;
this.test_mc._height = 100;
this.test_mc._lockroot = true;
this.test_mc._quality = "LOW";
this.test_mc._rotation = 90;
this.test_mc._soundbuftime = 2;
this.test_mc._visible = false;
this.test_mc._width = 200;
this.test_mc._x = 16;
this.test_mc._xscale = 128;
this.test_mc._y = 32;
this.test_mc._yscale = 256;
this.test_mc.useHandCursor = false; // ついでに

// トレース
trace("[before]");
trace("_alpha: " + this.test_mc._alpha);
trace("_droptarget: " + this.test_mc._droptarget);
trace("_focusrect: " + this.test_mc._focusrect);
trace("_height: " + this.test_mc._height);
trace("_lockroot: " + this.test_mc._lockroot);
trace("_name: " + this.test_mc._name);
trace("_parent: " + this.test_mc._parent);
trace("_quality: " + this.test_mc._quality);
trace("_rotation: " + this.test_mc._rotation);
trace("_soundbuftime: " + this.test_mc._soundbuftime);
trace("_target: " + this.test_mc._target);
trace("_visible: " + this.test_mc._visible);
trace("_width: " + this.test_mc._width);
trace("_x: " + this.test_mc._x);
trace("_xscale: " + this.test_mc._xscale);
trace("_y: " + this.test_mc._y);
trace("_yscale: " + this.test_mc._yscale);
trace("useHandCursor: " + this.test_mc.useHandCursor);

// ムービー読み込み
var listener:Object = new Object();
listener.onLoadInit = function(target_mc:MovieClip)
{
	// 読み込んだので再トレース
	trace("\n[after]");
	trace("_alpha: " + target_mc._alpha);
	trace("_droptarget: " + target_mc._droptarget);
	trace("_focusrect: " + target_mc._focusrect);
	trace("_height: " + target_mc._height);
	trace("_lockroot: " + target_mc._lockroot);
	trace("_name: " + target_mc._name);
	trace("_parent: " + target_mc._parent);
	trace("_quality: " + target_mc._quality);
	trace("_rotation: " + target_mc._rotation);
	trace("_soundbuftime: " + target_mc._soundbuftime);
	trace("_target: " + target_mc._target);
	trace("_visible: " + target_mc._visible);
	trace("_width: " + target_mc._width);
	trace("_x: " + target_mc._x);
	trace("_xscale: " + target_mc._xscale);
	trace("_y: " + target_mc._y);
	trace("_yscale: " + target_mc._yscale);
	trace("useHandCursor: " + target_mc.useHandCursor);
}
var loader_mcl:MovieClipLoader = new MovieClipLoader();
loader_mcl.addListener(listener);
loader_mcl.loadClip("b.swf", this.test_mc);

// おしまい
this.stop();

---------- スクリプト終わり -----------
---------- 出力結果始まり -----------
[before]
_alpha: 50
_droptarget: 
_focusrect: true
_height: 0
_lockroot: true
_name: test_mc
_parent: _level0
_quality: LOW
_rotation: 90
_soundbuftime: 2
_target: /test_mc
_visible: false
_width: 0
_x: 16
_xscale: 128
_y: 32
_yscale: 256
useHandCursor: false

[after]
_alpha: 50
_droptarget: 
_focusrect: null
_height: 56.3
_lockroot: true
_name: test_mc
_parent: _level0
_quality: LOW
_rotation: 90
_soundbuftime: 2
_target: /test_mc
_visible: true
_width: 112.65
_x: 16
_xscale: 127.999877929688
_y: 32
_yscale: 255.999755859375
useHandCursor: true

--------- 出力結果終わり -----------
野中文雄
Åê¹ÆNo.34005
投稿日時: 2007-7-4 22:06
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: MovieClip.loadMovie 後の挙動について
外部ファイルをロードしたとき、インスタンスのプロパティには、(1)値がクリアされるものと、(2)一定の値にリセットされるもの、そして(3)ロードしたデータの値で更新されるものがあります。→「MovieClip.loadMovieで外部ファイルを読込む」>「3. MovieClip.loadMovieで外部ファイルを読込む際の注意」

デフォルト値をもたず、ユーザーが設定するプロパティは(1)に属する傾向があるようには感じられます(すべて調べていませんし、例外もあるかもしれません)。ただ、とくにアンダースコア「_」で始まる古いプロパティについては、ActionScriptが実装されるFlash 5より前の仕様や実装を引きずっているようで、明快な分類の指針はなさそうに思われます。
引用:
kokooさんは書きました:
1. _root のタイムラインで createEmptyMovieClip する
2. できたムービークリップのプロパティ( _ で始まるもの)をいじる
3. できたムービークリップに外部SWF(単にシンボルひとつ置いただけのもの)を読み込む

で、3の前後で trace したものを見比べたんですが、値が引き継がれているものとそうでないものがあり、やはり悩ましいかぎりです。


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

c-geru
Åê¹ÆNo.34007
投稿日時: 2007-7-4 22:57
職人
居住地: 文京区本郷
投稿: 209
使用環境:
10.6.8+ CS5.5
Win7+ CS4
Re: MovieClip.loadMovie 後の挙動について
引用:
これは微妙に納得がいかないのですが(すみません)、「_alpha などがMovieClipクラスに保存される」というプロトタイプベースの考え方に基づくと、MovieClipオブジェクトの _alpha プロパティにすべてのインスタンスがアクセスできてしまうわけで、オブジェクトの汚染が起こるはずだと思うんです。

ちょっと書き方が悪かったですね 。「インスタンスに明示的に値が設定されているMovieClip固有のプロパティの値は、インスタンスに保持される」といいたかったのです。ここで「インスタンスに明示的に値が設定されている」とは、変形・情報・プロパティなどのパネル上で設定が可能な値を指しています。

kokooさんが調査された結果を見ても、ほぼ当てはまるかなと思います。_width,_heightは読み込まれるswfのサイズが変われば、当然変わってきますが。

ただ野中さんも書かれているように、正確な線引きが出来ないみたいですね。

基本的には「loadMovie完了後の値は引き継がれない」という前提の元、ロード後に明示的に設定してやる・・・という対処になりますかね。私が既存のMovieClipにロードする際は、空のMovieClipを配置して、特に値を設定しないようにしています。

kokooさんのご質問は「どうして一部のプロパティのみ値が引き継がれるのか」なので、回答にはならないのですが。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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