SWFファイルの外部読込みとMovieClip.attachMovie()メソッド [Edit]

リンケージ設定された[ライブラリ]のMovieClipシンボルは、SWFに関連づけられるようです。

つまり、外部SWFファイルを読込んだとき、ロード対象のMovieClipインスタンスをターゲットにしてMovieClip.attachMovie()メソッドを呼出すと、引数に渡したリンケージ識別子はそのSWFファイルの[ライブラリ]に設定されていなければなりません。

サンプルを作成して確認する

以下のような手順でサンプルムービーを作成して、MovieClip.attachMovie()メソッドの動作を確かめてみましょう。

手順

  1. 新規flaファイルをふたつ用意し、それぞれ"main.fla"、"sub.fla"という名前で同階層に保存します。
  2. ふたつのflaファイルに、ひとつずつMovieClipシンボルを作成し、リンケージ[識別子]を設定します。識別子名は、"main.fla"のMovieClipシンボルが"oval"、"sub.fla"は"rectangle"とします(図001)。ともにステージ上には、何も配置せず、空白にしておきます。

  3. 図001■ふたつのファィルにそれぞれリンケージ[識別子]の設定されたMovieClipシンボルを作成

  4. "sub.fla"を[ムービープレビュー]して、"sub.swf"を書出します。
  5. "main.fla"の第1フレームに、つぎのスクリプト001を記述したうえで、[ムービープレビュー]により結果を確認します。

スクリプト001■外部SWFのロードとMovieClip.attachMovie()メソッドのテスト

// fla(swf)ファイル: main.fla
// タイムライン: メイン
// 第1フレームアクション
// 外部SWFファイルをロードするMovieClipインスタンスの生成
var _mc:MovieClip = createEmptyMovieClip("my_mc", this.getNextHighestDepth());
_mc._x = Stage.width/2;
_mc._y = Stage.height/2;
// リスナーオブジェクト生成
var _mcl:MovieClipLoader = new MovieClipLoader();
var oListener:Object = new Object();
// 外部SWFロード完了時のコールバック関数設定
oListener.onLoadInit = function(target_mc:MovieClip):Void {
  var temp_mc:MovieClip;
  // 読込み元メインタイムラインをターゲットにattachMovie()を呼出す
  temp_mc = attachMovie("oval", "oval0_mc", getNextHighestDepth());
  temp_mc._alpha = 50;
  temp_mc = attachMovie("rectangle", "rectangle0_mc", getNextHighestDepth());
  temp_mc._alpha = 50;
  // ロードされたMovieClipをターゲットにattachMovie()を呼出す
  temp_mc = target_mc.attachMovie("oval", "oval1_mc", target_mc.getNextHighestDepth());
  temp_mc._alpha = 50;
  temp_mc = target_mc.attachMovie("rectangle", "rectangle1_mc", target_mc.getNextHighestDepth());
  temp_mc._alpha = 50;
};
_mcl.addListener(oListener);
_mcl.loadClip("sub.swf", _mc);

サンプルの動作結果

ロード元"main.swf"のメインタイムラインと、"sub.swf"がロードされたMovieClipインスタンスを各ターゲットとして、MovieClipシンボルの"oval"と"rectangle"をそれぞれMovieClip.attachMovie()メソッドで配置しようとしました。

しかし4つの呼出しのうち、ロード元メインタイムラインをターゲットとしたときは"main.swf"の[ライブラリ]に設定した"oval"のみ(oval0_mc)、"sub.swf"を読込んだMovieClipインスタンスがターゲットのときは"rectangle"のみ(rectangle1_mc)しか、インスタンスは生成されませんでした(図002)。

図002■ロード元タイムラインとロード対象インスタンスそれぞれにMovieClip.attachMovie()を実行

よって、リンケージ設定された[ライブラリ]のシンボルは、SWFファイルに関連づけられると考えられます。つまり、外部SWFファイルを読込んだ場合、ロード対象のMovieClipインスタンスをターゲットにしてMovieClip.attachMovie()メソッドを呼出すと、引数に渡したリンケージ識別子はその外部SWFファイル内で検索されるようです。

したがって、MovieClip.attachMovie()メソッドのターゲットに指定したSWFの[ライブラリ]内に、引数のリンケージ[識別子]を設定したMovieClipシンボルが存在しなければなりません。

[関連情報]
FLASH-japan「loadClipしたMCにattachMovieをしても表示されない
FumioNonaka.com「共有シンボルのインスタンスがattachMovie/attachSoundで作成できない
Flashcoders「attachMovie fails on embedded clip in a movie, why?

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事