Platform: All
Version: 6.0 and above
1. 現象
MovieClip.duplicateMovieClip()メソッドは、元となったMovieClipインスタンスのプロパティをfunctionも含めてすべて複製します。ところが、メソッドを実行した直後に、複製されたMovieClipのfunctionを実行しようとしても、実行されません。functionは、MovieClipの第1フレームに定義してあっても、オブジェクトアクションonClipEvent (load)で設定しても同じです。
2. 原因
MovieClip.duplicateMovieClip()メソッドを実行した後、MovieClipに設定されたfunctionが読み込まれるまでには、若干の時間を必要とするようです。したがって、直後に複製したMovieClipのfunctionを呼び出しても、未定義(undefined)と認識され、実行されません。
なお、メソッド実行直後でも、複製されたMovieClip自体はすでに生成されています。このとき、MovieClipに予め組み込まれているプロパティは、調べたり、設定することが可能です。また、MovieClipにグローバル変数を設定することもできます。
3. 対処法
MovieClip.duplicateMovieClip()メソッドを実行したフレームより後のフレームで、MovieClipのfunctionを実行してください。また、そのfunctionの目的が複製されたMovieClipのプロパティやグローバル変数を設定することでしたら、オブジェクト指向の考え方からは外れますが、MovieClip.duplicateMovieClip()メソッドを実行したアクションに続けて、これらの設定を行う方法も考えられます(上野亨『FLASH ActionScriptバイブル』p.613参照)。
なお、上級者向けの手法をご紹介します。複製元MovieClipインスタンスを、メインタイムラインに配置した_root.source_mcとします。インスタンスsource_mcには、つぎのMovieClipアクションを設定し、functionとしてxToDo()を定義します。なお、以降のスクリプトでは、ActionScript 2.0の厳密な型指定を行っています。
// MovieClip: 複製元MovieClip「source_mc」
// MovieClipアクション
onClipEvent (load) {
// 複製直後に実行したいfunction
trace(["load", this]);
function xToDo():Void {
trace (this);
}
}
|
Flash Player 6以降であれば、MovieClip.onLoadイベントハンドラメソッドを、MovieClip.duplicateMovieClip()メソッドの第3引数として指定すれば、そのコールバック関数がonClipEvent (load)イベントハンドラアクションの実行後に呼出されます。
// MovieClipの複製とfunctionの設定および実行
//「source_mc」を配置したタイムライン: たとえば_root
// フレームアクション
var _mc:MovieClip =
this.source_mc.duplicateMovieClip("child_mc", 1, {onLoad:xInitialize});
trace(["Before", this.child_mc, this.child_mc.xToDo]); // 動作確認用
function xInitialize():Void {
trace(["After", this, this.xToDo]); // 動作確認用
this.xToDo(); // functionの実行
}
|
[出力]パネルには、つぎのように表示されます。
Before,_level0.child_mc,undefined
load,_level0.source_mc
load,_level0.child_mc
After,_level0.child_mc,[type Function]
_level0.child_mc
[付記]
Flash 5における対応方法として、以前本稿ではつぎのように、実行したいfunctionを複製元のMovieClipから複製直後のMovieClipにスクリプト中で設定する手法を紹介していました。しかし、Flash MX以降では、複製元MovieClipインスタンスがフレームアクションの記述されているフレームから配置されている場合、複製元MovieClipのfunctionをフレームアクションから参照することができません。
したがって、もし以下のスクリプトを利用する場合には、複製元インスタンスはフレームアクションよりも前のフレームから配置しておかなければなりません。
// MovieClipの複製とfunctionの設定および実行
//「source_mc」を配置したタイムライン: たとえば_root
// フレームアクション
this.source_mc.duplicateMovieClip("Child_mc", 1);
trace (["Before", typeof this.Child_mc.xToDo]); // 動作確認用
this.Child_mc.xToDo = this.source_mc.xToDo; // 実行したいfunctionを定義
trace (["After", typeof this.Child_mc.xToDo]); // 動作確認用
this.Child_mc.xToDo(); // functionの実行
|
作成者: 野中文雄
協力者: Tatsuo Kato youichi 林 理
更新日: 2006年9月29日 上級者向けの手法をFlash Player 6以降に対応するように修正、およびレイアウトの整理。
更新日: 2002年8月19日 サンプルスクリプトで使用するインスタンス名を変更・コメント補足
更新日: 2001年10月10日 複製後のMovieClipにfunctionを設定したうえで実行する手法を追加
作成日: 2001年9月3日