[訳者注*2] MovieClipインスタンスを配置したタイムラインに、このイベントハンドラメソッドを定義して動作する場合は、かなり限定されます。実際上は、タイムラインに定義することはまれで、またその使用も適切とはいえない場合が少なくないでしょう。
たとえば、タイムラインにつぎのフレームアクション(スクリプト001)を設定しても、通常は動作しません。ところが、そのインスタンスにMovieClipアクションを何かしら設定(最低限半角スペースひとつでも可)すると、MoiveClip.onLoadイベントハンドラメソッドが呼出されるようになります。
スクリプト001■MovieClipを配置したタイムラインのフレームアクションでMovieClip.onLoadメソッドを設定
// フレームアクション
// MovieClipインスタンスmy_mcを配置
var my_mc:MovieClip;
my_mc.onLoad = function() { // 呼出されない
trace(this);
};
|
メインタイムラインの第1フレームで_level0(_root)に設定したMovieClip.onLoadイベントハンドラメソッドは、呼出されるようです(スクリプト002)。しかし、ブラウザで確認すると、MozillaベースのブラウザやSafariでは呼出されないという報告がされています(Flash Player 7)。
スクリプト002■第1フレームアクションでメインタイムライン自身にMovieClip.onLoadメソッドを設定
// メインタイムライン: _level0
// 第1フレームアクション
this.createTextField("my_txt", 1, 10, 10, 100, 20);
var my_txt:TextField;
this.onLoad = function() {
my_txt.text = this;
};
|
上記ふたつのサンプル(スクリプト001および002)では、MovieClip.onLoadイベントハンドラメソッドの呼出しが確実でなく、正規にサポートされる動作であるかも疑問です。イベントハンドラを設定するにはインスタンス(タイムライン)が存在しなければならず、それがすでに存在するのであればロードは済んでいると考えられるからです。
[訳者注*3] ここで「タイムラインに定義」というのは、ActionScript 1.0で#initclipブロックにクラスを定義した場合を意味しているのかもしれません(スクリプト003)。クラス定義でMovieClip.onLaodイベントハンドラメソッドを設定すれば、インスタンスのロード時にメソッド(コールバック関数)はつねに正しく呼出されます。
スクリプト003■MovieClipの第1フレームアクションでActionScript 1.0クラス定義
// シンボルリンケージ識別子: "mySymbol"
// 第1フレームアクション
// ActionScript 1.0クラス定義
#initclip
function MyClass() {
}
Object.registerClass("mySymbol", MyClass);
MyClass.prototype = new MovieClip();
MyClass.prototype.onLoad = function() {
trace(this); // インスタンスのパスが出力
};
#endinitclip
|
[訳者注*4] MovieClipを継承しただけでは、MovieClip.onLoadを始めとするMovieClipクラスのイベントハンドラメソッドは呼出されません(スクリプト004)。new演算子でコンストラクタ関数を呼出してインスタンスを生成しても、[出力]パネルには以下のようにコンストラクタの呼出し結果しか表示されません。
[出力]:
instantiated,[object Object]
スクリプト004■MovieClipを継承しただけではイベントハンドラメソッドは呼出されない
// ActionScript 2.0クラス定義ファイル: MyClass.as
class MyClass extends MovieClip {
function MyClass() {
trace(["instantiated", this]);
}
function onLoad():Void {
trace(["loaded", this]);
}
}
|
イベントハンドラメソッドが呼出されるためには、MovieClipシンボルにクラスを関連づける必要があります。ActionScript 2.0クラスは、[シンボルプロパティ]の[AS 2.0クラス]に指定します(図001)。
図001■[シンボルプロパティ]の[AS 2.0クラス]にクラスを設定
そうすると、そのMovieClipインスタンスがフレームに配置されたとき、コンストラクタについでMovieClip.onLoadイベントハンドラメソッドが呼出されます。MovieClipをメインタイムラインに配置して、インスタンス名をmy_mcとすると、[出力]パネルにはつぎのように表示されます。
[出力]:
instantiated,_level0.my_mc
loaded,_level0.my_mc
したがって、「MovieClipクラスを継承するクラス」だけでは、イベントハンドラメソッドを呼出すには不十分です。併せて、「シンボルにリンケージ設定したクラス」にする必要があります。
[訳者注*5] onClipEvent (load)イベントハンドラアクションは、外部SWFがロードされなくても、タイムラインに配置された時点で1度呼出されます。ですから、外部SWFのロード時にのみ行いたい処理は、onClipEvent (data)ハンドラに記述する方が扱いやすいでしょう(「MovieClip.loadMovieで外部ファイルを読込む」参照)。