ダイナミックに作成するインスタンスの型指定 [Edit]

タイムラインに配置するMovieClipやTextFieldインスタンスについても、ActionScript 2.0の型指定を行うことが可能です。型指定を行うと、型のシンタックスチェックが行われるほか、コードヒントを表示することができて便利です。しかし、インスタンスをダイナミックに作成する際には、注意が必要です。

MovieClipインスタンスmy_mcを予めタイムラインに配置しておいた場合、以下のスクリプトは問題なく動作します。なお、Flash(SWF)ファイルと同階層に、外部JPEGファイル"test.jpg"が配置してあるものとします。

スクリプト001■ロード用のターゲットMovieClipを予めタイムラインに配置
// フレームアクション
// タイムラインにMovieClipインスタンスmy_mcを配置
var my_mc:MovieClip;
my_mc.loadMovie("test.jpg");

ところが、ロード用のターゲットMovieClipをつぎのようにダイナミックに作成した場合、外部JPEGファイルを読込むことができません。

スクリプト002■ロード用のターゲットMovieClipをダイナミックに作成
// フレームアクション
var my_mc:MovieClip;
// ターゲットのMovieClipをダイナミックに作成
this.createEmptyMovieClip("my_mc", 0);
my_mc.loadMovie("test.jpg");

理由は、[ムービープレビュー]で[デバッグ]メニューから[変数のリストアップ]をしてみるとわかります。[出力]パネルの表示には、以下の2行が含まれています。

変数 _level0.my_mc = undefined
ムービークリップ: ターゲット="_level0.my_mc"

型指定をした識別子my_mcが、ダイナミックに作成されたインスタンスとは別個の「変数」として認識されています。変数の値は、未定義undefinedです。そして、MovieClip.loadMovie()メソッドは、この未定義変数に対して呼出されてしまっているようです。

この問題を回避するひとつの方法は、インスタンスをダイナミックに作成してから、MovieClipに対する型指定を行うことです。

スクリプト003■ロード用のターゲットMovieClipを作成してから型指定する
// フレームアクション
this.createEmptyMovieClip("my_mc", 0);
// MovieClipをダイナミックに作成してから型指定
var my_mc:MovieClip;
my_mc.loadMovie("test.jpg");

しかし、型指定をスクリプトの途中に置くのは、あまり見やすいスタイルとはいえません。ActionScript 2.0を使用できるのは、Flash Player 6以降です。その場合、MovieClip. createEmptyMovieClip()などダイナミックにMovieClipインスタンスを作成するメソッドは、戻り値として新規に作成されたインスタンスのパスを返します。この戻り値を使う方が、スクリプトはすっきりします。

スクリプト004■MovieClip. createEmptyMovieClip()メソッドの戻り値を型指定
// フレームアクション
var _mc:MovieClip = this.createEmptyMovieClip("my_mc", 0);
_mc.loadMovie("test.jpg");

もっとも、TextFieldインスタンスをダイナミックに作成するMovieClip.createTextField()メソッドには、Flash MX 2004(Flash Player 7)でも戻り値がありません。したがって、インスタンス作成後に型指定するという手法を採らざるを得ないでしょう。

スクリプト005■ダイナミックに作成したTextFieldインスタンスを型指定
// フレームアクション
this.createTextField("my_txt", 1, 0, 0, 100, 20);
// TextFieldをダイナミックに作成してから型指定
var my_txt:TextField;
my_txt.text = "test";

どうも気持ちがよくありません。

その他の記事