サイトトップ

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

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

ダイナミックに作成したMovieClipやTextFieldの型指定

ID: FN0502001 Product: Flash

Platform: All
Version: MX 2004

問題
ActionScript 2.0では、MovieClipやTextFieldインスタンスに対しても、型指定を行うことができます。しかし、ダイナミックに作成したインスタンスについては、その指定のタイミングに注意が必要です。たとえば、つぎのスクリプト(001)を実行すると、 MovieClip.loadMovie()メソッドが動作せず、外部SWFはロードされません。

スクリプト001■MovieClip.loadMovie()メソッドが動作しない

// タイムライン: _root
// フレームアクション
var my_mc:MovieClip;
this.createEmptyMovieClip("my_mc", 1);
trace(my_mc);  // 出力: undefined
my_mc.loadMovie("test.swf");  // 動作しない

原因
理由を確かめるために、[ムービープレビュー]で[デバッグ]メニューから[変数のリストアップ]を実行してみます。[出力]パネルには、つぎのような表示が含まれています。

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

タイムライン_level0に、同名の異なる識別子として、変数のmy_mcとMovieClipインスタンスのmy_mcとが作成されています。型指定した変数my_mcにはMovieClipインスタンスが格納されず、未定義(undefined)と認識されています。その変数をターゲットにしてMoiveClip.loadMovie()が呼出されたため、メソッドは存在せず、外部SWFもロードされなかったということです。

対処法
ダイナミックに生成したインスタンスの型指定は、作成のためのメソッドを呼出した後に行う必要があるようです(スクリプト002)。

スクリプト002■インスタンス作成後に型指定をするとMovieClip.loadMovie()メソッドが動作する

// タイムライン: _root
// フレームアクション
this.createEmptyMovieClip("my_mc", 1);
var my_mc:MovieClip;  // インスタンス生成後に型指定
my_mc.loadMovie("test.swf");  // 動作する

しかし、変数の宣言がインスタンスを作成するステートメントより後にくるのは違和感を覚えます。作成したインスタンスと型指定された識別子が同じものだということも、一見してわかりづらいと思われます。ダイナミックにMovieClipを生成するメソッドは、その戻り値として新規に作成されたインスタンスのパスを返します。その戻り値を型指定する方が、スクリプトとしては見やすいでしょう(スクリプト003)。

スクリプト003■MovieClipを生成するメソッドの戻り値に型指定を行う

// タイムライン: _root
// フレームアクション
// MovieClip.createEmptyMovieClip()メソッドの戻り値に型指定
var _mc:MovieClip = this.createEmptyMovieClip("my_mc", 1);
_mc.loadMovie("test.swf");

もっとも、TextFieldインスタンスを作成するTextField.createTextField()メソッドには、戻り値がありません[*1]。したがって、TextFieldについては、インスタンス生成後に型指定を行うというスタイルを取らざるを得ません(スクリプト004)。

スクリプト004■TextFieldを生成するメソッドの呼出し後に型指定を行う

// タイムライン: _root
// フレームアクション
this.createTextField("my_txt", 1, 10, 10, 100, 20);
var my_txt:TextField;  // インスタンス生成後に型指定
my_txt.text = "test";


[*1] MovieClip.createTextField()メソッドは、Flash Player 8から生成されたTextFieldインスタンスを戻り値として返します(スクリプト005)。

スクリプト005■Flash Player 8ではMovieClip.createTextField()メソッドがインスタンスを返す

// パブリッシュ: Flash Player 8
// タイムライン: _root
// フレームアクション
// 書出しFlash Playerバージョン
trace(this.getSWFVersion());   // 出力: 8
// MovieClip.createTextField()メソッドの戻り値取得
var _txt:TextField = this.createTextField("my_txt", 1, 0, 0, 100, 20);
trace(_txt);   // 出力: _level0.my_txt

_____

作成者: 野中文雄
更新日: 2006年1月21日 MovieClip.createTextField()メソッドに関する注釈[*1]を追加
作成日: 2005年2月8日


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