ActionScript 3.0では、オーサリング時に予め配置してあるインスタンスについての型指定が、2.0とは変わっているようです。
ActionScript 2.0では、予め配置してあるインスタンスも、変数と同じようにスクリプトの冒頭で型指定しました。たとえば、MovieClipとTextFieldのインスタンスが、それぞれmy_mcとmy_txtという名前をつけて配置されているとします。ActionScript 2.0では、つぎのように型指定します。
スクリプト001■ActionScript 2.0のフレームアクションで予め配置してあるインスタンスを型指定
// フレームアクション
var my_mc:MovieClip;
var my_txt:TextField;
ところが、同じ型指定をActionScript 3.0のフレームアクションで行うと、名前空間internalにインスタンス名の矛盾が生じている旨を示すコンパイルエラーになります。
A conflict exists with definition my_mc (またはmy_txt) in namespace internal.
どうやら、ActionScript 3.0のフレームアクションでは、予め配置してあるインスタンスは、その宣言をしなくても自動的に型が認識されるようです。たとえば、以下の図001のようにMovieClipとTextFieldのインスタンスにそれぞれzという変数を設定しようとすると、つぎのようなエラーが生じます。なお、つぎのクラスを使ったテストにも流用するため、ふたつのインスタンスはMovieClipシンボル(TestMovieClip)内に入れ子にしてあります。
flash.text.TextFieldのプロパティzを作成できません。
図001■ActionScript 3.0のフレームアクションで型指定せずインスタンスに変数を設定
これはmy_txtがTextFieldインスタンスとして認識され、かつTextFieldクラスにzというプロパティが存在しないことを示すものです。MovieClipインスタンスの方は、変数を自由に追加できるダイナミックなクラスのため、エラーになりません。つまり、MovieClipインスタンスも、正しく認識されていることになります。ActionScript 2.0との動作の違いは戸惑う面もあるものの、手間が減るという利点はあるでしょう。
ActionScript 3.0のクラス定義では、このような自動認識は働きません。インスタンスはプロパティとして宣言し、型指定もしておく必要があります。MovieClipとTextFieldのインスタンスmy_mcおよびmy_txtをMovieClipシンボル内に配置し、そのシンボルの[Linkage Properties]に[Class]として設定するクラスTestは(図002)、たとえば以下のように定義します(スクリプト002)。
図002■[Linkage Properties]ダイアログボックスで[Class]を指定
スクリプト002■予めインスタンスの配置してあるMovieClipシンボルに設定するActionScript 3.0クラス
// ActionScript 3.0クラス定義ファイル: Test.as
// MovieClipシンボルの[Class]に設定
// シンボル内にはMovieClipインスタンスmy_mcとTextFieldインスタンスmy_txtを配置
package {
import flash.display.MovieClip;
import flash.text.TextField;
public class Test extends MovieClip {
public var my_mc:MovieClip;
public var my_txt:TextField;
function Test() {
my_mc.z = 100;
// my_txt.z = 100; // プロパティが存在しないのでコンパイルエラー
my_txt.x = 100;
}
}
}
ActionScript 3.0クラス定義では、必要なクラスはimportしなければなりません。また、MovieClipシンボルに設定するクラスは、public指定する必要があります。さらに、MovieClipシンボル内に配置してあるインスタンスも、publicでプロパティ宣言すべきことに注意しましょう。