サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

MovieClip.duplicateMovieClipで複製したMovieClipのfunctionが実行されない

ID: FN0109001 Product: Flash

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日


© 2001 and beyond Fumio Nonaka All rights reserved.