ActionScript 3.0でも、MovieClipインスタンスに名前をつけて、参照したり管理することができます。しかし、インスタンス名の果たす役割は、ActionScript 2.0/1.0とは少し変わりました。
Flashムービーを作成する際、つまりオーサリング時にタイムラインに配置したMovieClipインスタンスには、従来のバージョンと同じように、[プロパティ]インスペクタでインスタンス名を設定できます(図001)。
図001■[プロパティ]インスペクタでインスタンス名を設定
そして、スクリプトでインスタンス名を参照することにより、MovieClipインスタンスのコントロールが可能です。たとえば、タイムラインに配置したMovieClipインスタンスの水平座標を0に設定するには、つぎのようなフレームアクションを記述します。
// フレームアクション
// MovieClipインスタンスmy_mcを配置
my_mc.x = 0;
文字列としてのインスタンス名を調べるには、DisplayObject.nameプロパティの値を取出します(図002)。
// フレームアクション
// MovieClipインスタンスmy_mcを配置
var name_str:String = my_mc.name;
trace(name_str); // 出力: my_mc
図002■インスタンス名はDisplayObject.nameプロパティで取得する
ActionScript 3.0でMovieClipインスタンスを動的に配置するには、インスタンスはコンストラクタで生成し、タイムラインの子インスタンスとして加える(DisplayObjectContainer.addChild()メソッドを使う)ことによりステージに表示します。
たとえば、[ライブラリ]のMovieClipシンボルに[クラス]として"Pen"という識別子を設定したとすると(図003。 MovieClipシンボルへの[クラス]の設定については、「クラスを文字列で参照したい」参照)、以下のようなフレームアクションでインスタンスを配置することができます(なお、[ライブラリ]のビットマップやSpriteインスタンスの動的な配置について、「ビットマップをダイナミックに配置する」および「new演算子でビジュアルオブジェクトをつくる」参照)。
図003■[リンケージプロパティ]で[クラス]に名前を指定する
// フレームアクション
// MovieClipシンボルに[クラス]として"Pen"を設定
var my_mc:MovieClip = new Pen();
addChild(my_mc);
trace(my_mc.name); // 出力: instance1
上記フレームアクションは最後のステートメントで、DisplayObject.nameプロパティの値を[出力]しています。すると、"instance1"という文字列が返されました(図004)。これは、インスタンス名がない場合に自動的に設定される名前です。
図004■動的に配置したインスタンスには自動的に名前が設定される
特定のインスタンス名をつけたいときは、以下のフレームアクションのようにDisplayObject.nameプロパティにその文字列を設定する必要があります。ただし、注意しなければならないのは、インスタンス名は文字列ですので、スクリプトでその名前を参照してインスタンスは操作できないということです(図005)。
// フレームアクション
// MovieClipシンボルに[クラス]として"Pen"を設定
var my_mc:MovieClip = new Pen();
addChild(my_mc);
my_mc.name = "myName";
trace(my_mc.name); // 出力: myName
図005■文字列のインスタンス名でインスタンスは参照できない
もっとも、動的に生成したインスタンスは、上記スクリプトのmy_mcのように変数に納めておくのが通常です。そうすれば、その変数を参照して、インスタンスのコントロールは可能になります。もし、タイムラインに配置したインスタンスの名前からインスタンスを参照する必要があるときには、つぎのフレームアクションのようにDisplayObjectContainer.getChildByName()メソッドにより文字列から参照を取得します。
// フレームアクション
// MovieClipシンボルに[クラス]として"Pen"を設定
var my_mc:MovieClip = new Pen();
addChild(my_mc);
my_mc.name = "myName";
// インスタンス名から参照を取得して操作
var target_mc:MovieClip = MovieClip(getChildByName("myName"));
trace(target_mc.name); // 出力: myName
target_mc.x = 0;
ただし、DisplayObjectContainer.getChildByName()メソッドの戻り値がDisplayObjectだということに、注意が必要です。取得した参照をMovieClipインスタンスとして、そのプロパティやメソッドにアクセスするためには、MovieClipにキャストしなければなりません(キャストについては、「rootプロパティでメインタイムラインの関数にアクセスできない」参照)。
上述のとおりActionScript 3.0では、インスタンス名は参照のためにはあまり使いやすいとはいえず、インスタンスを変数に格納して制御する方がよさそうです。インスタンス名は、他のインスタンスと区別して特定するためのプロパティだと思われます。
けれども、前述「オーサリング時に配置したMovieClipインスタンス」では、タイムラインに予め配置して[プロパティ]インスペクタで設定したインスタンス名は、そのまま変数のように参照として扱うことができました。これは、ActionScript 3.0では、Flashがインスタンス名と同じ名前の変数を自動的に宣言して、そこにインスタンスの参照を格納する仕組みになっているからです[*1]。したがって、やはり変数によりインスタンスを参照するというのが、ActionScript 3.0の基本だといえます。
[*1] ヘルプの[ActionScript 3.0 のプログラミング] > [ActionScriptの使用について] > [オブジェクトの操作] > [オブジェクトインスタンスの作成]には、つぎのように説明されています。
Flashでは、ムービークリップシンボル、ボタンシンボル、またはテキストフィールドをステージに配置し、プロパティインスペクタでインスタンス名を割り当てた場合、自動的にそのインスタンス名で変数が宣言され、オブジェクトインスタンスが作成され、そのオブジェクトが変数に格納されます。
この記事へのコメント
●1.YO(2008年08月06日 15:16)
初期のころからさまざまに拝見させていただいております。
私も昨日からAS3.0を使い始めました。今回のこれはC言語のポインタみたいな感じということですね。メモリの番地、それは只のストリングであると。
図001のいわゆるインスタンス名に入れる値が、AS3ではスクリプト上の変数と同じものだと考えてると間違いにくいですね。正確であるかどうかは別にして。。。
●2.野中 文雄(2008年08月14日 05:19)
> 図001のいわゆるインスタンス名に入れる値が、AS3ではスクリプト上の変数と同じものだと考えてると間違いにくいですね。
_____
「同じものだ」と考えて結構です。DisplayObject.nameプロパティの値であると同時に、同名の変数に参照が代入されます。
●3.YO(2009年07月30日 12:07)
>野中さん
返信ありがとうございます。
勉強になりました。