Flash SWF ファイル内から、他の外部 SWF ファイルをアセットとして読み込むことができます。外部 SWF ファイルを読み込む理由はいくつかあります。

  • プロジェクトは複数のムービーに分割できるため、個々の SWF ファイルのサイズは小さくなります。ファイルのサイズが小さくなるほど高速に読み込まれるため、効率的なメモリ管理ができます。  
  • ユーザーはムービーで行っている内容に基づいて、必要なコンテンツのみを読み込むことができます。
  • ブラウザーで別の HTML ページをわざわざ読み込まなくても、複数の SWF ファイルを連続して再生できます。ページでは、再読み込みに関係する一時停止やリフレッシュは行われません。
  • そのため、プロジェクトアセットの編成についても高い柔軟性が得られます。
  • 単一の SWF ファイルに依存しない複雑なユーザーインターフェイスを作成できます。多数の SWF ファイルを組み合わせてインターフェイスを作成できます。SWF ファイルを組み合わせることで、インターフェイスの他のパートに影響を及ぼすことなく、サイズを抑えた SWF ファイルを個々に改訂できるため、編集が簡単になります。
  • 複数の作成者が FLA ファイルを別々に処理することで、同一プロジェクトで共同作業を行うことができます。

コンテンツを別々の SWF ファイルに配置することは、コンテンツをそれぞれ固有のムービークリップシンボルに配置することに似ています。違いは、コンテンツがメイン SWF ファイルの外に存在することです。JPG、PNG、GIF などのイメージファイルも読み込むこともできます。

外部 SWF ファイルを別の SWF ファイルから読み込むには、以下のいずれかを使用します。

  • ActionScript 3.0 Loader クラス
  • ActionScript 2.0 の loadMovie コマンド
  • ActionScript 2.0 MovieClipLoader クラス

ActionScript 3.0 Loader クラスの使用

ActionScript 3.0 の Loader クラスは、外部コンテンツの読み込みと表示に使用する DisplayObject のサブクラスです。SWF ファイルを読み込むには、クラスの load メソッドを使用します。load メソッドには、必須パラメーターがひとつあります。それは、読み込むコンテンツの URL アドレスが含まれる URLRequest インスタンスです。

以下のコード例では、Loader インスタンスを作成し、「myExternalMovie.swf」という名前の外部 SWF ファイルを読み込みます。

var myLoader:Loader = new Loader();                     // create a new instance of the Loader class
var url:URLRequest = new URLRequest("ExternalSWF.swf"); // in this case both SWFs are in the same folder 
myLoader.load(url);                                     // load the SWF file
addChild(myLoader);                                     // add that instance to the display list, adding it to the Stage at 0,0

// (optional)
myLoader.x = 10;                                        // move the loaded SWF 10 pixels to the right (from the left edge)   
myLoader.y = 175;                                       // move the loaded SWF 175 pixels down from the top

// (optional) load a second external SWF file
var my2ndLoader:Loader = new Loader();
var url2:URLRequest = new URLRequest("ExternalSWF2.swf");
my2ndLoader.load(url2);
addChild(my2ndLoader);                                  // optionally, you could put the 2nd SWF beneath 
                                                        // the 1st by using addChildAt(my2ndLoader, 1);
                                                        // displacing the 1st SWF from position 1 to 2 in the display list

// (optional) scaling of the 2nd SWF file
my2ndLoader.scaleX = 2;                                 // scale the SWF horizontally by 200%
my2ndLoader.scaleY = 2;                                 // scale the SWF vertically by 200%

ロードする SWF ファイルの URL は、相対 URL でも、絶対 URL でもかまいません。Flash Player における URL の処理方法の詳細については、以下の相対パスを参照してください。Loader クラスの詳細については、「Platform ActionScript 言語リファレンスガイド」の Loader を参照してください。

root のリファレンスには(公開時に)、SWF ファイルにおける表示リストのツリー構造の一番上の表示オブジェクトが常に反映されます。(画像の場合、root は Bitmap オブジェクトを参照します。)

注意: ActionScript 3.0 には、ActionScript 2.0 の _lockroot または _level プロパティに相当するものはありません。「ActionScript 3.0 デベロッパーガイド」の「表示プログラミングの基本事項」を参照してください。

ActionScript 2.0 の loadMovie コマンドの使用

loadMovie コマンドは、ActionScript 2.0 において外部 SWF ファイルまたは画像を MovieClip、あるいは親ムービーの別のレベルにロードします。

loadMovie コマンドには、次の 2 つの形式があります。

  • MovieClip.loadMovieメソッド: MovieClip メソッドは、外部コンテンツを特定のムービークリップインスタンスにロードする際に使用します。
  • loadMovie グローバル関数:グローバル関数 loadMovie を使用して、コンテンツをムービーまたはレベルにロードできます。グローバルバージョンには、loadMovieloadMovieNum という 2 つのバリエーションもあります。1 番目のバリエーションはコンテンツをムービーまたはレベルにロードします。2 番目のバリエーション(loadMovieNum)は特定してレベルにロードします。

MovieClip.loadMovie

外部コンテンツをムービークリップインスタンスに読み込む際には、MovieClip メソッドの loadMovie の使用をお勧めします。このバージョンは、コンテンツのロード先であるムービークリップから直接呼び出され、コンテンツの URL を渡されます。

myMovieClipInstance.loadMovie("myExternalMovie.swf");  // here only the filename is given, indicating the SWF file 
                                                       // is in the same folder as the parent SWF.

ロードするコンテンツの URL は、相対 URL でも、絶対 URL でもかまいません。Flash Player における URL の処理方法の詳細については、以下の相対パスを参照してください。

ロードすると、コンテンツはコンテナムービークリップ内に表示されます。ロケーションなど、コンテナムービークリップの基本プロパティは保持されます。ただし、コンテナムービークリップ内で定義したカスタムプロパティまたは関数は存在しません。新しいコンテンツが以前のすべてのコンテンツ(onRelease などのコードやイベントハンドラーなど)に置き換わるためです。そのため、ムービークリップに対して onLoad イベントハンドラーを使用しようとしても無視されます。その場合は、代わりに MovieClipLoader クラスを使用します(下記参照)。MovieClip.loadMovie の詳細については、ActionScript 2.0 言語リファレンスの MovieClip.loadMovie を参照してください。

グローバル関数 loadMovie と loadMovieNum

loadMovie コマンドは、グローバル関数としても存在します。この関数には、2 つの必須パラメーター、外部コンテンツの URL と、コンテンツのロード先 target があります。target パラメーターは、文字列またはリファレンスのいずれかです。以下の行は、ムービークリップインスタンス「myContainer」に「myExternalMovie.swf」をロードすることと同等です。

loadMovie("myExternalMovie.swf", myContainer);    // the target myContainer is an object reference
loadMovie("myExternalMovie.swf", "myContainer");  // the target "myContainer" is a string

loadMovie は、コンテンツを Flash Player のさまざまなレベルにロードすることもできます。Flash Player のレベルは Player のレイヤーに似ています。複数のムービーを、互いに入れ子にしなくても、Flash Player の同じインスタンスで再生できます。各レベルは、ムービーが他のレベル内のムービーとは無関係に再生できる固有のルートを示します(_lockroot の使用は不要)。

ActionScript でレベルをリファレンスするには、_level と、それに続いて数字(レベル番号を表す)を使用します。Flash Player にロードする最初のムービーは _level0 にあります。他のレベルは、このレベルの最上位に追加できます。loadMovie に対する以下のコールは、Player で再生している現在のムービーの最上位のレベル 1 に「myExternalMovie.swf」をロードします。

loadMovie("myExternalMovie.swf", "_level1");

グローバル関数 loadMovie のバリエーションは loadMovieNum です。このメソッドは loadMovie と似ていますが、ターゲットがレベルのみである点と、ターゲットを名前ではなく数値で設定する点が異なります。例えば、外部 SWF ファイルをレベル 1 (_level1)にロードするには、以下のようにします。

loadMovieNum("myExternalMovie.swf", 1);

レベルにロードする際には、loadMovie の代わりに loadMovieNum を使用することをお勧めします。詳細については、「ActionScript 2.0 言語リファレンス」の「global loadMovie」を参照してください。

_lockroot を使用した _root コンフリクトの回避

外部ムービーを別のムービーにロードする際に、ロードしたムービークリップの _root リファレンスは、そのメインタイムラインから、ロードしたムービーのタイムラインに変わります。つまり、_root のリファレンス先は常に階層内の最上位のタイムラインです。_root が最上位のタイムラインをリファレンスしないようにするには、ロードしたムービークリップのメインタイムラインの _lockroot プロパティを true に設定します。このプロパティは、このタイムラインのすべての子に、_root をリファレンスするときにこのタイムラインをリファレンスするように指定します。

this._lockroot = true;     // add this code in the main timeline of the SWF file that will be loaded into another SWF

注意: _lockroot プロパティは、パブリッシュ先が Flash Player 7 以降である場合にのみ有効です。

 ActionScript 2.0 MovieClipLoader クラスの使用

ActionScript 2.0 の MovieClipLoader クラスの機能は、外部コンテンツを MovieClip インスタンスに読み込むプロセスを簡素化することです。前述のように、ムービークリップで定義した変数と関数は、そのムービークリップに新しいコンテンツを読み込む際に削除されます。onLoad などのコールバックは不可能です。ただし、MovieClipLoader は、上記のようなイベントの代理として機能して、この制限を回避します。別のムービークリップへのコンテンツの読み込みを管理するため、MovieClipLoader インスタンスを別々に作成します。従って、このムービークリップ内の変数や関数のクリアは発生しません。

MovieClipLoader クラスを用いてコンテンツをムービークリップにロードする際に、まず、そのクラスの新しいインスタンスを作成します。次に、loadClip を用いて、コンテンツをターゲットムービークリップにロードします。以下の例では、新しいコンテンツを myContainer ムービークリップにロードします。

var myLoader:MovieClipLoader = new MovieClipLoader();
myLoader.loadClip("myExternalMovie.swf", myContainer);

コンテンツがロードされていることを確認する場合は、MovieClipLoader インスタンスと onLoadInit イベントハンドラーを併用します。

var myLoader:MovieClipLoader = new MovieClipLoader(); 
myLoader.addListener(this); 
myLoader.loadClip("myExternalMovie.swf", myContainer); 

function onLoadInit(mc:MovieClip) 
    { 
        trace("content has been loaded into "+mc); 
    }

ムービークリップへのコンテンツのロードに関する情報をさらに詳細に制御するには、MovieClip.loadMovie ではなく、MovieClipLoader クラスを使用します。(例えば、ロードの進行状況を確認できるようにするには、このイベントハンドラーを使用します)。MovieClipLoader クラスの詳細については、ActionScript 2.0 言語リファレンスの MovieClipLoader を参照してください。

注意: MovieClipLoader クラスは、パブリッシュ先が Flash Player 7 以降である場合にのみ有効です。

 相対パスを使用したコンテンツのロード

Loader および loadMovie と相対パスの併用は混乱を招くことがあります。SWF ファイルまたはムービークリップのタイムラインは loadMovie アクションを実行できるため、「ムービーはどちらのタイムラインに対して相対ロードされるのか」と求められます。_level0 のメインタイムラインに対して相対ですか?それとも、ムービーロードアクションを実行したタイムラインに対して相対ですか?答えは単純です:ロードするムービーは常に、ムービーをロードしたタイムラインに対して相対です。相対パス(外部 SWF ファイルに対しても相対)の説明については、相対 URL が正しくリファレンスされていない | Flash (tn_04157)を参照してください。

フレームレートに関する注意事項

一般に、ロードしたムービーは親ムービーのフレームレートを継承します。例えば、フレームレート 12 fps の SWF ファイルは、フレームレート 24 fps のムービーにロードすると、24 fps で再生されます。唯一の例外は、ロード中のムービーで、同期を「ストリーム」に設定しているタイムライン上にサウンドが含まれている場合です。このときに限り、メインムービーは、ロードしたムービーのフレームレートを継承して、このサウンドは正確に再生されます。

注意: ActionScript 3.0 では、Stage.frameRate プロパティを使用してフレームレートを動的に変更できます。

キーワード: Flash Player, ムービーのロード; ActionScript; スクリプティング; レベル; tell target; 変数; target; インスタンス; SWF; loadMovie; tn_14190

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー