サイトトップ

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

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

外部SWFムービー内のfunctionをロード直後に呼出す

ID: FN0304001 Product: Flash

Platform: All
Version: MX and Above

外部SWFムービーの中に定義された'function'を、'MovieClip.loadMovie'メソッドでロードした直後に呼出したい場合があります。けれど、メソッドを実行した直後に'function'を呼出そうとしても、呼出せません。SWFの読込みが'function'を実行できる段階にまで至っていないからです。

1. onClipEvent (load)はターゲットのMovieClip登場時にも呼出される
MovieClipアクションの'onClipEvent (load)'イベントハンドラアクションに設定することが、ひとつ考えられます。'MovieClip.loadMovie'メソッドで外部SWFをロードすると、読込みが完了したときにこのハンドラが呼出されます。

けれども、'onClipEvent (load)'イベントハンドラは、外部SWFを読込む前に、そのターゲットのMovieClipがフレームに登場したときにも1度呼出されます。外部SWFをロードしたときだけ処理を実行したいとすれば、その判別のためのスクリプトを書かなければなりません。。

'onClipEvent (data)'イベントハンドラで読込みの完了を判定して処理する方が、スクリプトとしてはわかりやすいでしょう。

2. MovieClip.onLoadイベントハンドラメソッドは呼出されない
Flash MXからMovieClipのメソッドには、'MovieClip.onLoad'イベントハンドラメソッドが加わりました。XMLやLoadVars、Soundオブジェクトの同名メソッドと同じく、データのロードが完了すると呼出されます。

けれども、このイベントハンドラメソッドは、'MovieClip.loadMovie'メソッドと組合わせて使うことができません。なぜなら、外部SWFムービーがロードされると、ユーザーの定義したすべての変数やプロパティがクリアされます。'MovieClip.onLoad'イベントハンドラメソッドの定義も、このクリアされるプロパティに含まれるのです。

したがって、SWFの読込みが完了したときには、このイベントハンドラメソッドの定義がクリアされてしまい、設定した処理は実行されません。

'MovieClip.onLoad'イベントハンドラメソッドは、おもにコンポーネントを作成する場合に用いられるものです。

3. setIntervalアクションを使う
ここでは'setInterval'アクションを使う方法をご紹介します。'setInterval'は、指定した間隔で処理を繰返し実行することができます。'onClipEvent (enterFrame)'イベントハンドラとは異なり、画面再描画のタイミングには連動しません。

setInterval
Flashムービーを再生している間、一定の間隔で指定した関数やメソッド実行します。

'setInterval'アクションは、つぎのように設定します。

setInterval(関数, 実行間隔);

[関数]には、関数名を指定するか、'function'を直接記述(「名前のない関数(匿名関数/関数リテラル)」で指定)します。その関数の中に必要な処理を記述します。[実行間隔]は、関数を繰返し実行する間隔をミリ秒で指定します。

今回は、一旦ロードが完了すれば、それ以降ロード確認の処理は必要ありません。つまり、実行する関数は、いわば使い捨てです。こうした場合には、ユーザー定義関数を設定してその関数名を指定するより、'function'を直接記述する方が簡単です。

'function'を直接記述する場合のスクリプトのスタイルは、以下のようになります。'function'の内容が見やすいように、改行を入れてあります。

nID = setInterval(function () {
  ステートメント;
}, 実行間隔);

[ステートメント]には、通常のユーザー定義関数と同様に、複数のステートメントを記述することができます。'setInterval'アクションを定義すると、その設定を識別するための整数IDが返されます。この整数IDは、'setInterval'アクションの定義をクリアしたいときに使用します。

外部SWFムービーをロードするターゲットのMovieCliptがメインのタイムラインに配置されたインスタンスmy_mc、SWF内に定義されている'function'の名前はxTestだとすると、つぎのようなスクリプトになります。

// _root: メインのタイムライン
// フレームアクション
this.my_mc.loadMovie("test.swf");
//[1]setIntervalアクションを定義して識別IDを変数nIDに設定
nID = setInterval(function () {
  //[2]実行する'function'が未定義かどうかを確認
  if (_root.my_mc.xTest != undefined) {
    //[3]functionを実行
    _root.my_mc.xTest();
    //[4]ロードを完了したらsetIntervalアクションをクリア
    clearInterval(nID);
  }
  //[5]関数の実行間隔を10ミリ秒に指定
}, 10);

'setInterval'アクションに指定した'if'条件で、'function'が未定義かどうかを判別しています。'function'の準備がまだできていなければ、'function'を調べたときに未定義値'undefined'が返ります。

'if'条件の中で、'function'名xTestの後に括弧()はつきませんのでご注意ください。括弧()をつけると、'function'の「実行」になってしまいます。'function'自体の内容を確認する場合には、括弧()はつけません。

'undefined'でなければ、'function'の準備は整ったことになります。そこで、'function'を実行したうえで、'clearInterval'アクションにより'setInterval'の定義をクリアします。

4. setIntervalアクションの定義をクリアする
'setInterval'アクションは、その定義をしたタイムラインやMovieClipからは独立して、処理が実行されます。ですから、'setInterval'が呼出す関数の中に、明示的にクリアの処理を記述しておく必要があります。

'setInterval'の関数実行をクリアするのが、'clearInterval'アクションです。'clearInterval'を実行する際には、クリアする'setInterval'アクションを識別するための整数IDを引数として指定する必要があります。

'clearInterval'アクションと組合わせた'setInterval'の標準的な定義スタイルは、つぎのようになります。

nID = setInterval(function () {
  // 関数が呼出されたときに実行する処理
  // 必要に応じてclearIntervalを実行するための条件を設定
  clearInterval(nID);
}, 実行間隔);

なお、処理の内容によっては'setInterval'の識別IDを別途変数に格納しておいて、'setInterval'に定義した関数の外からクリアする場合もありえます。

_____

作成者: 野中文雄
作成日: 2003年4月12日


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