« 定数とエスケープ記号 | メイン | インスタンスのプロパティ »

ムービークリップインスタンスの参照

ActionScriptでは、ムービークリップシンボルのインスタンスのプロパティの値を変更することで位置を動かしたり大きさを変えるといったアニメーションを行います。インスタンスのプロパティの値を調べたり変更するにはドット演算子(.)または配列演算子([])を使って目的のインスタンスのメソッドやプロパティを指し示します。ドット演算子の場合にはドットに続いて識別子を直接書くのに対し、配列演算子を使う場合には["識別子"]のようにストリングにします。
たとえば、メインのタイムラインにmy_mcというインスタンスがある場合には、次のようになります。

例:
ドット演算子を使ったとき
_root.my_mc
配列演算子を使ったとき
_root["my_mc"]

my_mcのプロパティ_x(水平座標)の値を150に設定する式は次のようになります。

例:
ドット演算子を使ったとき
_root.my_mc._x = 150;
配列演算子を使ったとき
_root["my_mc"]._x = 150;

配列演算子を使えばインスタンス名を変数で指定できるので、参照するインスタンスを次のように動的に指定できます。

例:
targetMC = "my_MC";
_root[targetMC]._x = 150;

これまではeval()関数を使っても同様のことができましたが、Flash 5以降では参照式にeval()関数を書くことはできなくなりました。

例:
targetMC = eval("myMC" + 1);
_root.targetMC._x = 150; // 成功

// Flash 5以降ではエラー
_root.eval("myMC" + 1)._x = 150;

note:
Flash3とFlas4ではインスタンスの参照にスラッシュシンタックスが利用されていました。スラッシュシンタックスはFlash Player 7でも動作しますが使用を推奨されていません。ActionScript2.0ではスラッシュシンタックスをサポートしていません。


■_root
ムービークリップシンボルのインスタンスを特定するために、インスタンス名、_root、this、_parent、およびlevelというキーワードを使います。まず、ムービー自身を_rootで指します。ステージに置いたムービークリップは_rootの下にあることになります。たとえば、ステージに置いたムービークリップのインスタンス名がTVならば、

_root.TV

のように指します。このとき、インスタンス名の大文字小文字を区別するので注意してください。名前がTVのときにtvでは参照できません。TVの中にscreenというインスタンス名のムービークリップが入れ子で入っている時screenは、

_root.TV.screen

になります。TVの中のeyeというインスタンス名のムービークリップは、

_root.TV.eye

のように指すことができます。このような参照方法をドットシンタックスと呼びます。ドット演算子(.)は「の」と置き換えて読むとわかりやすいでしょう。「_root.TV.screen」は「_rootのTVのscreen」です。
 これを配列演算子を使って書くと次のようになります。このほうが便利な場合もあるので合わせて覚えてください。こちらはブラケットアクセスと呼びます。

_root["TV"]["eye"]

図3-1-1 ステージにTVというインスタンス名のムービークリップがあり、その中にscreenとeyeというインスタンスが入れ子で入ってます。

なお、MovieClipLoader.loadClip()メソッドまたはloadMovie()関数でインスタンスに別のswfを読み込んで表示する場合には_root参照について注意が必要です。インスタンスにswfを読み込むと、そのswfはインスタンスと入れ替わってしまうので、swfが元々参照していた_rootとは変わってしまいます。読み込まれたswf内での_rootの参照がずれないようにするには、次のように_lockrootプロパティをtrueに設定します。(_lockrootプロパティ→p.??)

//インスタンスtvに読み込んでもswfの_root参照がずれないようにする
this._lockroot = true;


note:
クラスから生成したオブジェクトをインスタンスといいますが、ここではシンボルをステージに配置して作ったインスタンスについて書いています。_root、_parent。_levelはムービークリップシンボルの階層を示す場合にのみ使用されます。

■this(ムービークリップのインスタンスの場合)
thisは、ムービークリップアクションやフレームアクションが設定されているムービークリップのインスタンス自身を指します。「_root.TV.eye」といった参照は階層を_rootからたどった絶対位置で指し示すものですが、これに対してthisは自分を相対的に示します。
たとえば、ムービークリップシンボルのTVインスタンスに設定してあるonClipEventオブジェクトアクションの中に「this._x」とあるとき、これはTVのx座標を指します。つまり「_root.TV._x」と同じです。もし、TVインスタンスが_rootのすぐ下ではなく、別のムービークリップの中に入れ子になっていたとしても、やはりthisはTVを指します。同様にthis._xがインスタンスeyeに設定してあるオブジェクトアクションの中にあればthisが指すものはeyeであり、this._xはeyeのx座標を指します。このようにthisはまさしく「これ」です。this._xは「これのx座標」と言い換えることができます。(onClipEvent→p.??)

//thisはムービークリップアクションを設定してあるインスタンスを指す
onClipEvent (enterFrame) {
  r = (r+0.3) % (2*Math.PI);
  this._xscale = 100*Math.sin(r);
}

インスタンスのイベントハンドラやメソッドを設定するfunctionブロックの内側にあるthisもそのインスタンスを指します。次のスクリプトはメインのタイムラインのフレームアクションに書かれています。上のハンドラはchoインスタンスにonEnterFramイベントハンドラを設定しています。この中のthisはchoインスタンスを指します。下のハンドラはmushiインスタンスにonPressイベントハンドラを設定しています。この中のthisはmushiインスタンスを指します。(フレームアクション→p.??)

//自動的にchoインスタンスが回転
cho.onEnterFrame = function() {
  this._rotation += 5;
};

//mushiインスタンスをクリックすると回転
mushi.onPress = function() {
  this._rotation += 5;
};

■this(ボタンのインスタンスの場合)
ボタンのインスタンスに設定したオブジェクトアクションについては注意が必要です。ボタンに設定してあるonハンドラの中でthisが指すものはボタンのインスタンス自身ではありません。thisはボタンが置いてあるインスタンスを指します。次のスクリプトを設定してあるボタンをクリックすると、ボタンが回転するのではなく、ボタンが置いてあるムービークリップのインスタンスが回転します。(onハンドラ→p.??)

//ボタンが置かれているインスタンスが回転する
on (press) {
  this._rotation += 5;
}


ボタンもインスタンス名をつければフレームアクションからイベントハンドラを設定できます。この中で指すthisはボタンのインスタンスになります。たとえば、ボタンのインスタンス名がmy_btnであるとき、ボタンが置いてあるタイムラインのフレームアクションに次のスクリプトを書きます。この場合にはthisが指すものはボタンのインスタンスなので、ボタンをクリックするとボタン自身が回転します。

//ボタンをクリックするとボタン自身が回転する
my_btn.onPress = function(){
  this._rotation += 5;
}

ボタンをクリックして別のムービークリックインスタンスを回転させるには、thisではなく、回転させたいインスタンスを指し示すようにします。

//my_btnボタンをクリックするとmushiインスタンスが回転
my_btn.onPress = function(){
  _root.mushi._rotation += 5;
}


■_parent
_parentは相対的に1つ上の階層のインスタンスを指します。さらにその上のインスタンスならば、_parent._parentというように上の階層へたどることができます。
あるムービークリップから見た時に、それが置いてあるムービークリップは_parentになります。自分が置いてあるタイムラインのフレームアクションで定義してあるメソッドや関数にアクセスするには、_parent.mymethod()のように参照することになります。

■_level
loadMovieNum()アクションを使うことで、現在のムービーに別のswfを読み込んで重ねて表示することができます。このときのムービーの重なりを_levelで示します。通常の1つしかムービーがない状態の大元のレベルが_level0になります。この上に重ねて読み込んだムービーを、_level1、_level2、_level3...のように指します。
_rootは各レベルのタイムラインを参照しています。したがって通常は_rootと_level0は同じです。しかし、実際には複数のムービーを重ねて表示しているとき、それぞれの_levelに_rootがあります。

note:
ムービークリップに別のswfやJPEGを読み込んで差し替える場合にはMovieClipLoader.loadClip()メソッドまたはloadMovie()関数を利用します。

■指定がない場合
_root、this、_parentといった指定がない場合には、スクリプトが書かれているインスタンスを指します。メインのタイムラインのフレームアクションならば、指しているのは_rootと同じになります。ムービークリップのタイムラインのフレームアクションやオブジェクトアクションならばthisはそのムービークリップのインスタンスを指します
たとえば、次の例では_rotationが参照するのはchoインスタンスが配置されているタイムラインを指します。メインのタイムラインにchoが置いてあるならば、_root._rotationと同じになるのでステージ全体が回転します。choが別のムービークリップの中に入っているのならば、choを含んでいるインスタンスが回転します。

//choが置かれているステージ全体が回転
cho.onEnterFrame = function() {
 _rotation += 5;
};


図3-1-2 インスタンスC_mcを基準(this)にすると相対的な参照はこのようになります。

投稿者 oshige : 2005年2月12日 10:41