[AS3] オーサリング時に配置されたインスタンスの型指定 [Edit]

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のフレームアクションで型指定せずインスタンスに変数を設定
FF070212_001.gif

これは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]を指定
FF070212_002.gif

スクリプト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でプロパティ宣言すべきことに注意しましょう。

その他の記事