サイトトップ

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

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

MovieClip.attachMovieで配置したMovieClipのfunctionが実行されない

ID: FN0307006 Product: Flash

Platform: All
Version: MX and above

1. 現象
'MovieClip.attachMovie'メソッドは、[リンケージ]設定をしたムービークリップシンボルのインスタンスを[ライブラリ]から直接ステージに配置します('MovieClip.attachMovie'メソッドについて、詳しくは「ActionScript辞書」または拙著『モーショングラフィックスで学ぶActionScript − Flash MX −』p.169〜「6.2 何もないステージにMovieClipを配置する」参照)。このときムービークリップシンボルのフレームアクションに設定した'function'は、当然インスタンスに含まれます。ところが、メソッドを実行した直後に、配置したMovieClipの第1フレームに定義した'function'を呼出しても、実行されません。

2. 原因
'MovieClip.attachMovie'メソッドを実行した後、MovieClipに設定された'function'が読込まれるまでには、若干の時間を必要とするようです。したがって、配置した直後にMovieClipの'function'を呼び出しても、未定義('undefined')と認識され、実行されません。

たとえば、以下のフレームアクションを実行すると、[出力]ウィンドウに'undefined'と表示されます。

//[テスト用スクリプト]
// _root: MovieClipインスタンスをダイナミックに配置
// フレームアクション
this.attachMovie("mySymbol", "my_mc", 1);
trace(this.my_mc.xCall);  // 出力: undefined
this.my_mc.xCall();  // 実行されない

// MovieClip: 配置されるムービークリップシンボル
// リンケージ識別子: mySymbol
// 第1フレームアクション
function xCall() {
  trace(this);  // 確認用にターゲットパスを出力
}

なお、メソッド実行直後でも、配置されたMovieClip自体はすでに生成されています。このとき、MovieClipの定義済みのプロパティ(たとえば'MovieClip._x')やメソッド(たとえば'MovieClip.gotoAndPlay')は、設定したり呼出すことが可能です。

3. 対処法
'MovieClip.attachMovie'メソッドを実行したフレームより後のフレームで、MovieClipの'function'を実行してください。

Flash MXから実装されたイベントハンドラメソッド'MovieClip.onEnterFrame'を使って、フレーム待ちの処理を行うことができます。

//[テスト用スクリプト]
// _root: MovieClipインスタンスをダイナミックに配置
// フレームアクション
this.attachMovie("mySymbol", "my_mc", 1);
this.onEnterFrame = function() {  // [1]イベントハンドラメソッドを定義
  this.my_mc.xCall();  // [2]'function'を呼出し
  delete this.onEnterFrame;  // [3]イベントハンドラメソッドの定義をクリア
};

// MovieClip: 配置されるムービークリップシンボル
// リンケージ識別子: mySymbol
// 第1フレームアクション
function xCall() {
  trace(this);  // 確認用にターゲットパスを出力
}

[1] 'function'の呼出しを1フレーム待たせるために、処理を'MovieClip.onEnterFrame'イベントハンドラメソッドに設定しています。イベントハンドラメソッドには、処理を定義した'function'名または「名前のない関数」を設定します(イベントハンドラメソッドについて、詳しくは前掲『モーショングラフィックスで学ぶActionScript − Flash MX −』p.110〜「4.7 イベントを第1フレームで処理する」参照)。ここでは、後者によりました。

[2] 'MovieClip.attachMovie'メソッドで配置したMovieClipの'function'を呼出します。配置後最初にフレームが描画されるときに、イベントハンドラメソッド'MovieClip.onEnterFrame'の処理は実行されます。したがって、配置から1フレーム遅れた処理になります。

[3] 'function'を1度呼出したら処理は終了ですので、'MovieClip.onEnterFrame'イベントハンドラメソッドの定義をクリアします。定義のクリアには、'delete'演算子を使用します(イベントハンドラメソッドの定義クリアについて、詳しくは前掲『モーショングラフィックスで学ぶActionScript − Flash MX −』p.162〜参照)。

[注記] クラスに定義したメソッド(中・上級者向け情報)
'Object.registerClass'メソッドを使ってムービークリップシンボルにクラス定義をした場合、クラスのメソッドは'MovieClip.attachMovie'メソッドでMovieClipを配置した直後でも呼出すことができます。

//[テスト用スクリプト]
// _root: MovieClipインスタンスをダイナミックに配置
// フレームアクション
// クラス定義
function MyClass() {}
MyClass.prototype = new MovieClip();
MyClass.prototype.xCall = function() {
  trace(this);
};
Object.registerClass("mySymbol", MyClass);
// MovieClipの配置
this.attachMovie("mySymbol", "my_mc", 1);
trace(this.my_mc.xCall);  // 出力: [type Function]
this.my_mc.xCall();  // 実行される

// MovieClip: 配置されるムービークリップシンボル
// リンケージ識別子: mySymbol
// *前記と同様のためスクリプトは省略

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

_____

作成者: 野中文雄
作成日: 2003年7月24日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.