Flashムービーの構造
バグの多くが、ターゲットパスの指定ミスでしょう。
Flashでは、ムービークリップのプロパティ(メソッドを含む)にアクセスするには、対象となるムービークリップのターゲットパスを指定しなければなりません。他のオブジェクトのプロパティにアクセスするときも同様です。
Flashムービーを ActionScript から見ると、入れ子になったムービークリップの階層構造としてとらえることができます(メインタイムラインは _root または _level0 というムービークリップです。したがって、ステージ上にムービークリップを配置しただけでムービークリップの入れ子を作成したことになります)。
この階層構造は、Windows や UNIX のファイルシステムと同様に考えることができます。ご存知ない方は、HTMLファイルでリンク先やイメージのソースを指定するときのことを思い出してください。
ムービークリップをディレクトリ(フォルダ)に置き換えると理解しやすくなります。上の例で見てみましょう。まずルートディレクトリ(メインタイムライン: _root または _level0 )があり、その下にサブディレクトリ(mc1、mc2)があり、各サブディレクトリの下にさらにサブディレクトリ(mc3、mc4)があります。
そして、各ディレクトリ内にファイル(プロパティ)が存在します。
ファイルシステムでは、各ファイルにアクセスするとき、ディレクトリを移動するかパスを指定します。Flash でも、この階層を利用したパス指定によって、ムービークリップ(オブジェクト)のプロパティにアクセスします。
ターゲットパスは、ターゲットへの経路情報であり、いうならば、ムービークリップ(オブジェクト)の所在地を特定するアドレス(住所)だと考えてください。
絶対パス
では、実際のターゲットパスの指定方法を見てみましょう。
これも、ファイルシステムと同じく、絶対パスと相対パスの2つの指定方法があります。
まずは、絶対パスからです。
絶対パスは、_root を起点に、ターゲットまでの一連のムービークリップ(オブジェクト)名をドット演算子( . )で区切って指定します。
たとえば、下図の各ムービークリップのターゲットパスは、
_root→ _root
mc1 → _root.mc1
mc2 → _root.mc2
mc3 → _root.mc1.mc3
mc4 → _root.mc2.mc4
となります。通常は、プロパティにアクセスするわけですから、これらの後ろにさらにドット演算子( . )を付け、変数、定義済みプロパティ、メソッド名などを付加します。
nWidth = _root._width; // ルートの _width (幅)プロパティを取得し、変数 nWidth に代入。
_root.mc1.gotoAndPlay(10); // ムービークリップ mc1 の gotoAndPlay メソッドを実行(10フレームに移動して再生)。
_root.mc2._alpha = 50; // ムービークリップ mc2 の透明度を 50% に設定。
_root.mc1.mc3.hensuu = true; // ムービークリップ mc3 の変数 hensuu に ' true ' を代入。
_root.mc2.mc4.play(); // ムービークリップ mc4 の play メソッドを実行(再生)。
Flash の Version4 までは、区切り文字としてスラッシュ(/)を使用したスラッシュシンタックスが採用されていましたが、Version5 からは上記のようなドット( . )を使用したドットシンタックスが追加採用されています。他の言語への応用が利くように、なるべくドットシンタックスで記述することをお勧めします。
なお、絶対パスは、_root を起点とした指定であるため、同一の _root に所属するどのムービークリップからも同じ記述となります。
相対パス
一方、スクリプトを記述するムービークリップ(オブジェクト)を起点とするパス指定が相対パスです。
絶対パスとは異なり、スクリプトを記述する場所(ムービークリップまたはオブジェクト)によって、記述内容が変わってきます。
相対パスには、2つの重要なキーワードがあります。
まず、フレームアクションやオブジェクトアクションにスクリプトを記述するムービークリップ(オブジェクト)、自分自身のことを this で表します。多くの場合は省略可能ですが、重要なキーワードですので、必ず憶えてください。
次に、自分が入れ子になっている親ムービークリップ(オブジェクト)は _parent です。
相対パスは、この2つのキーワードを使用して、階層構造を表現します。
下図の例で見てみましょう。
スクリプトをmc3に記述する場合、パスの起点はmc3になります。
自分自身は this 、親であるmc2は _parent 、親の親であるmc1は _parent._parentで表します。このように、_parent を複数使用することによって、階層をさかのぼった記述をすることができます。
次にスクリプトを mc1 に記述する場合はどうなるでしょうか。
パスの起点である mc1が this になります。mc2 が子、mc3 が孫の関係ですが、子を表すキーワードは存在しませんので、ムービークリップ名をそのまま指定します。
mc2 は this.mc2、mc3 は this.mc2.mc3 となります。ただし this は省略可能ですので、通常は mc2、mc2.mc3 と記述します。
最後にスクリプトを mc2 に記述する場合も見てみましょう。
パスの起点である mc2 が this 、親の mc1 は _parent、mc3 は mc3(this.mc3)となります。
もうひとつ、枝分かれした他の階層にアクセスする場合も見てみましょう。
mc4 にスクリプトを記述するものとします。
パスの起点である mc4 が this 、親の mc2 は _parent、親の親の _root は _parent._parent です。mc1、mc3 は _root の子、孫ですので、この _parent._parent の後ろにムービークリップ名を記述します。mc1 は _parent._parent.mc1、mc3 は _parent._parent.mc1.mc3 となります。ただし、この記述は効率的ではありません。絶対パスでの記述が可能であれば、そちらを使用した方が、パスの記述が短くなります。
参考ムービー
パス指定を理解するためのムービーを用意しました。
[ 絶対パス ] [ 相対パス ] ポタンで、絶対パス/相対パスの切り換えができます。
まず、スクリプト記述元のムービークリップをクリックして選択してください。選択されたムービークリップは黄色に変化します。
次にターゲットのムービークリップをクリックして選択してください。選択されたムービークリップは緑色に変化します。そうするとターゲットパスの指定が下部に表示されます。スクリプト記述元は [ Reset ] ボタンでクリアできます。