Flashムービーの構造
バグの多くが、ターゲットパスの指定ミスでしょう。
Flashでは、ムービークリップのプロパティ(メソッドを含む)にアクセスするには、対象となるムービークリップのターゲットパスを指定しなければなりません。他のオブジェクトのプロパティにアクセスするときも同様です。
FlashムービーをActionScriptから見ると、入れ子になったムービークリップの階層構造としてとらえることができます(メインタイムラインは_rootまたは_level0というムービークリップです。したがって、ステージ上にムービークリップを配置しただけでムービークリップの入れ子を作成したことになります)。
この階層構造は、WindowsやUNIXのファイルシステムと同様に考えることができます。ご存知ない方は、HTMLファイルでリンク先やイメージのソースを指定するときのことを思い出してください。
ムービークリップをディレクトリ(フォルダ)に置き換えると理解しやすくなります。上の例で見てみましょう。まずルートディレクトリ(メインタイムライン:_rootまたは_level0)があり、その下にサブディレクトリ(a1_mc、a2_mc)があり、各サブディレクトリの下にさらにサブディレクトリ(b1_mc、b2_mc)があります。
そして、各ディレクトリ内にファイル(プロパティ)が存在します。
ファイルシステムでは、各ファイルにアクセスするとき、ディレクトリを移動するかパスを指定します。Flashでも、この階層を利用したパス指定によって、ムービークリップ(オブジェクト)のプロパティにアクセスします。
ターゲットパスは、ターゲットへの経路情報であり、いうならば、ムービークリップ(オブジェクト)の所在地を特定するアドレス(住所)だと考えてください。
絶対パス
では、実際のターゲットパスの指定方法を見てみましょう。
これも、ファイルシステムと同じく、絶対パスと相対パスの2つの指定方法があります。
まずは、絶対パスからです。
絶対パスは、_rootを起点に、ターゲットまでの一連のムービークリップ(オブジェクト)インスタンス名をドット演算子(
. )で区切って指定します。
たとえば、下図の各ムービークリップのターゲットパスは、
_root → _root
a1_mc → _root.a1_mc
a2_mc → _root.a2_mc
b1_mc → _root.a1_mc.b1_mc
b2_mc → _root.a2_mc.b2_mc
となります。通常は、プロパティにアクセスするわけですから、これらの後ろにさらにドット演算子( . )を付け、変数、定義済みプロパティ、メソッド名などを付加します。
this.nWidth = _root._width;
// ルートの_width(幅)プロパティを取得し、変数nWidthに代入。
_root.a1_mc.gotoAndPlay(10); //
ムービークリップa1_mcのgotoAndPlayメソッドを実行(10フレームに移動して再生)。
_root.a2_mc._alpha = 50;
// ムービークリップa2_mcの透明度を50%に設定。
_root.a1_mc.b1_mc.hensuu = true; // ムービークリップb1_mcの変数hensuuに
'true' を代入。
_root.a2_mc.b2_mc.play();
// ムービークリップb2_mcのplayメソッドを実行(再生)。
FlashのVersion4までは、区切り文字としてスラッシュ(/)を使用したスラッシュシンタックスが採用されていましたが、Version5からは上記のようなドット(
. )を使用したドットシンタックスが追加採用されています。他の言語への応用が利くように、なるべくドットシンタックスで記述することをお勧めします。
なお、絶対パスは、_rootを起点とした指定であるため、同一の_rootに所属するどのムービークリップからも同じ記述となります。まちがいが少なくて済みますが、記述が長くなりがちです。また、後述するムービークリップをターゲットとしたloadMovieの機能を利用すると、_rootの位置がずれるため、そのままでは動かなくなってしまいます。汎用性の面では、次に説明する相対パスの方が優れています。
相対パス
一方、スクリプトを記述するムービークリップ(オブジェクト)を起点とするパス指定が相対パスです。
絶対パスとは異なり、スクリプトを記述する場所(ムービークリップまたはオブジェクト)によって、記述内容が変わってきます。
相対パスには、2つの重要なキーワードがあります。
まず、ムービークリップやオブジェクト自身のことを this キーワード で表します。自分自身のプロパティにアクセスするときは
this.プロパティ名 (例:this._x)、メソッドを呼ぶときはthis.メソッド名()
(例:this.gotoAndPlay(5))、配下(子)のインスタンスにアクセスするときは this.インスタンス名
(例:this.a_mc) と記述します。絶対パスのように _root からのすべての経路を記述する必要がなく、省略した記述ができるようになります。
ただし、ひとつだけ例外があります。ボタンインスタンスのonイベントハンドラ内で記述されたthisは、ボタン自身を指さず、配置された親ムービークリップを指します。しかも、ムービークリップインスタンスのonイベントハンドラ内で記述されたthisは、ムービークリップ自身を指します。旧バージョンとの互換性のために残された仕様ですが、ユーザーには混乱をもたらす負の遺産です。まちがえないように十分、注意してください。これに関しては別のページで解説する予定です。
this キーワードは配下のプロパティにだけ使うものではありません。自分が配置されている親ムービークリップ、またその親ムービークリップを指定することもできます。その際に使用するのが、_parent
プロパティです。_parent は、ムービークリップ、ボタン、テキストフィールドのプロパティで、this._parent
と記述することで、親ムービークリップを示します。さらに、this._parent._parent (親の親)のように、_parent
を複数使用することによって、階層をさかのぼった記述をすることができます。
なお、_parent は、ムービークリップ、ボタン、テキストフィールドのプロパティですので、他のオブジェクトでは使用できません。
相対パスは、この2つのキーワードを使用して、階層構造を表現します。ただし、相対パスは、後述するレベル間では使用することができません。同一レベル内でのみ使用します。
下図の例で見てみましょう。
スクリプトを c_mc に記述する場合、パスの起点は c_mc になります。
自分自身は this 、親である b_mc は this._parent 、親の親である a_mc は this._parent._parentで表します。

次にスクリプトを a_mc に記述する場合はどうなるでしょうか。
パスの起点である a_mc が this になります。b_mc が子、c_mc が孫の関係ですが、子を表すキーワードは存在しませんので、ムービークリップ名をそのまま指定します。
b_mc は this.b_mc、c_mc は this.b_mc.c_mc
となります。ムービークリップを起点とした場合、 this は省略可能ですので、b_mc、b_mc.c_mcと記述することもできます。
最後にスクリプトを b_mc に記述する場合も見てみましょう。
パスの起点である b_mc が this 、親の a_mc は this._parent、c_mc は this.c_mc(c_mc)となります。
もうひとつ、枝分かれした他の階層にアクセスする場合も見てみましょう。
b2_mc にスクリプトを記述するものとします。
パスの起点である b2_mc が this 、親の a2_mc は this._parent、親の親の _root
は this._parent._parent です。a1_mc、b1_mc は_root の子、孫ですので、この this._parent._parent
の後ろにムービークリップ名を記述します。a1_mc は this._parent._parent.a1_mc、b1_mc は
this._parent._parent.a1_mc.b1_mc となります。ただし、この記述は効率的ではありません。絶対パスでの記述が可能であれば、そちらを使用した方が、パスの記述は短くなります。
参考ムービー
パス指定を理解するためのムービーを用意しました。
[絶対パス][相対パス]ポタンで、絶対パス/相対パスの切り換えができます。
まず、スクリプト記述元のムービークリップをクリックして選択してください。選択されたムービークリップは黄色に変化します。
次にターゲットのムービークリップをクリックして選択してください。選択されたムービークリップは緑色に変化し、ターゲットパスが下部に表示されます。スクリプト記述元は[Reset]ボタンでクリアできます。
・関連項目
loadMovie使用時のパス指定
|