サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

MovieClipLoaderクラスについて

ID: FN0501003 Product: Flash

Platform: All
Version: MX 2004 and Above

Flash MX 2004から、MovieClipLoaderクラスが実装されました。MovieClipLoaderクラスを使って外部SWFやJPEGファイルをロードすると、その進行状況に応じて各種のイベントが発生し、それらのイベントに対応した情報を取得することができます。また、複数のファイルを指定して、順次読込むことも可能です[*1]。本稿では、MovieClipLoaderクラスの使用について、簡単にポイントと注意点をまとめてご紹介します。詳しくは、オンラインヘルプ[ActionScriptリファレンスガイド]の[MovieClipLoaderクラス]およびその各メソッドの項をご参照ください。

[*1] Flash 8「ActionScript 2.0 リファレンスガイド」の「loadClip (MovieClipLoader.loadClip メソッド)」の項には、「このメソッドを使用すると、複数のSWFファイルを同時に表示し、別のHTMLドキュメントをロードせずにSWFファイルを切り替えることができます」とあります。正確な意味が明らかでなく、MoiveClipLoader.loadClip()メソッドを使って、同時に複数ファイルのロードが可能かどうかは疑問です。

Flash 8に付属するサンプル[Flash 8アプリケーション]/Samples and Tutorials/Samples/ActionScript/Galleries/gallery_tween.flaを見ますと、forステートメント内でMovieClipLoader.loadClip()メソッドを複数ファイルに対して連続して呼出しています(スクリプト001)。

スクリプト001■gallery_tween.flaのフレームアクション(抜粋)

/* create a function which loops through the images in an array,
and creates new movie clips on the Stage. */

function displayGallery(gallery_array:Array) {
  var galleryLength:Number = gallery_array.length;
  // loop through each of the images in the gallery_array.
  for (var i = 0; i<galleryLength; i++) {
    /* create a movie clip instance which holds the image. We'll also set a variable,
     thisMC, which is an alias to the movie clip instance. */

    var thisMC:MovieClip = this.createEmptyMovieClip("image"+i+"_mc", i);
    
    /* load the current image source into the new movie clip instance,
     using the MovieClipLoader class. */

    mcLoader_mcl.loadClip(gallery_array[i].src, thisMC);

[Flashcoders]における議論「Multiple moviecliploaders」によれば、可能な同時接続数はHTTP標準にもとづいて2ないし4接続とされているようです。もっとも、接続数の制限が具体的に問題になった例をあまり聞かないのは、ブロードバンドの普及によるものかもしれません。

しかし、複数ファイルを同時に指定した場合も、MovieClipLoaderクラスによって順次読込みが行われることになります。その順序は、必ずしもMovieClipLoader.loadClip()メソッドの呼出し順とは一致しません。したがって、ロードの順序を特定したい場合には、ひとつずつ順に読込みの処理を行わなければなりません。

1. MovieClipLoaderクラスを用いた外部ファイルの読込み
MovieClipLoaderクラスを使って外部SWFやJPEGファイルをロードするには、MovieClipLoader.loadClip()メソッドを利用します。また、ロード状況に応じたイベントを受取るために、イベントリスナーオブジェクトを作成する必要があります(スクリプト002)。

スクリプト002■MovieClipLoaderクラスを用いた外部SWFファイルのロード

// タイムライン: ターゲットのMovieClipインスタンスmy_mcを配置
// フレームアクション
// [1]インスタンスの生成
// MovieClipLoaderインスタンスの生成
var my_mcl:MovieClipLoader = new MovieClipLoader();
// リスナーオブジェクト生成
var oListener:Object = new Object();
// [2]リスナーイベントの設定
oListener.onLoadStart = function(target_mc:MovieClip) {
  // ロード開始時の処理
};
oListener.onLoadError = function(target_mc:MovieClip, error_str:String, nHttpStatus:Number) {
  // ロードできなかったときの処理
};
oListener.onLoadProgress = function(target_mc:MovieClip, nLoadedBytes:Number, nTotalBytes:Number) {
  // ロード中の処理
};
oListener.onLoadComplete = function(target_mc:MovieClip) {
  // ロード完了時の処理
};
oListener.onLoadInit = function(target_mc:MovieClip) {
  // ロードしたSWFの第1フレームアクション実行後の処理
};
// [3]イベントリスナーの登録
my_mcl.addListener(oListener);   // イベントリスナーに登録
// [4]外部ファイルの読込み
// 外部SWFファイル"test.swf"をインスタンスmy_mcにロード
my_mcl.loadClip("test.swf", my_mc);

[1]まず、外部SWFをロードするためのMovieClipLoaderインスタンスと、イベントを受取るリスナーオブジェクトを生成します。なお、ActionScript 2.0による型指定を行っています。

[2]リスナーオブジェクトには、受取る必要のあるリスナーイベントを指定して、コールバック関数を定義します。引数には、ロード対象のMovieClipインスタンスなどの情報が渡されます。

[3]MovieClipLoader.addListener()メソッドを使って、リスナーオブジェクトをMovieClipLoaderインスタンスに登録します。これにより、リスナーオブジェクトは、リスナーイベントを受取れるようになります。

[4]MovieClipLoader.loadClip()メソッドを使用して、外部ファイルを、指定したMovieClipインスタンスにロードします。

2. リスナーイベントについて
MovieClipLoaderクラスのリスナーイベントハンドラメソッドは、リスナーオブジェクトに設定します。MovieClipLoaderインスタンスに直接ハンドラを設定すると、ActionScript 2.0ではコンパイルエラーが発生します。MovieClipLoaderクラスには、リスナーイベントハンドラメソッドが定義されていないからです。MovieClipLoaderクラスは、リスナーオブジェクトをMovieClipLoader.addListener()メソッドで登録し、リスナーオブジェクトでリスナーイベントを受取る仕様でデザインされているのです。

外部ファイルをロードするターゲットのMovieClipは、リスナーオブジェクトとは別個のインスタンスです。しかし、イベント発生時の処理では、とくに複数のMovieClipインスタンスをターゲットにして外部ファイルを読込んだときには、ロード対象のMovieClipを知る必要がある場合は少なくないでしょう。そのため、リスナーイベントが呼出されるとき、コールバック関数には引数としてターゲットのMovieClipインスタンスのパスが渡されます。イベントによっては、その他の引数が渡されることもあります。

つぎに、リスナーイベントごとに、ポイントを確認していくことにしましょう。

MovieClipLoader.onLoadStart
外部ファイルのロードが開始されたときに呼出されます。Flash MX 2004の「ActionScriptリファレンスガイド」で、引数(taraget_mc)がObjectで型指定されているのは誤りです[*2]。

[*2]もっとも、Objectはダイナミックなクラスですので、引数をObject型で指定したうえでMovieClipクラスのプロパティやメソッドにアクセスしても、コンパイルエラーは発生しません。しかし、以下のような場合には、タイプ不一致のエラーとなります。

listenerObject.onLoadStart = function(target_mc:Object) {
  var _mc:MovieClip = target_mc;  // コンパイルエラー
};

MovieClipLoader.onLoadError
外部ファイルが完全にロードできなかったとき呼出されます。ロードの失敗を検知することができるのは、MovieClipLoaderクラスを使用する利点のひとつです。Flash MX 2004の「ActionScriptリファレンスガイド」で、第1引数(taraget_mc)がObjectで型指定されているのは誤りです(前出注[*2]参照)。また、コールバック関数における引数の指定はオプションです。

外部ファイルのロードそのものが開始されなかった場合、つまりMovieClipLoader.onLoadStartメソッドが呼出されなかったときには、コールバック関数に第2引数(errorCode)として文字列"URLNotFound"が渡されます。ロードが開始されても完了しなかったとき、つまりMovieClipLoader.onLoadCompleteメソッドが呼出されなかったときには、第2引数として文字列"LoadNeverCompleted"が渡されます。

Flash Player 8からは、第3引数としてサーバーから返されたHTTPステータスコードを数値で受取ります。たとえば、ステータスコード404は、要求されたURIに一致するものがサーバーで見つからなかったことを示します。サーバーからステータスコードを取得できなかったときなどのデフォルト値は0です。

MovieClipLoader.onLoadProgress
外部ファイルがローカルディスクにダウンロードされるたびに呼出されます。「ActionScriptリファレンスガイド」で、第1引数(taraget_mc)がObjectで型指定されているのは誤りです(前出注[*2]参照)。

コールバック関数の第2引数(loadedBytes)および第3引数(totalBytes)で、それぞれダウンロード済みのバイト数とファイルの総バイト数が取得できるので、ロードの進捗状況を計算することが可能です。

なお、Flash MX 2004では、このリスナーイベントは[ムービープレビュー]で発生せず、ローカルでは正しく取得することができません[*3]。イベントの処理は、データをサーバーにアップロードしたうえで確認する必要があります。Flash 8のMovieClipLoaderクラスではこの問題が解決され、[ムービープレビュー]でもイベントが発生するようです。ロード状況をシミュレートし、イベントを繰返し発生させるためには、[ムービープレビュー]のモードで[表示] > [ダウンロードのシミュレート]を用います。

MovieClipLoader.onLoadComplete
外部ファイルのロードが完了した直後、つまり総バイト数が読込まれたとき(target_mc.getBytesLoaded() == target_mc.getBytesTotal())に呼出されます。「ActionScriptリファレンスガイド」で、引数(taraget_mc)がObjectで型指定されているのは誤りです(前出注[*2]参照)。

MovieClipインスタンスの初期化は、必ずしも完了していないことにご注意ください。したがって、このリスナーイベントでは、MovieClipインスタンスのプロパティにアクセスすることは避けましょう[*4]。また、[ムービープレビュー]では、イベントが正しいタイミングで発生しないようです。外部ファイルをロードした後のターゲットインスタンスの処理は、多くの場合MovieClipLoader.onLoadInitイベントで行う方が適しているでしょう。

[*3] LiveDocs Flash MX 2004 [ActionScript Language Reference] > [MovieClipLoader.onLoadProgress]コメント欄のとくに旧MacromediaのFrancis Cheng氏による回答をご参照ください。

[*4] たとえば、このリスナーイベントのコールバック関数内でターゲットインスタンスのMovieClip._widthプロパティを設定すると、読込まれたコンテンツは表示されないことがあります。

ターゲットが初期化される前のMovieClip._widthプロパティは、一旦0になります。このときこのプロパティに値を設定しようとすると、0以上の値には変更できないため、0が指定されたものとして処理されます。したがって、データをロードした後も値が0に固定され、コンテンツが表示されない結果となります。

MovieClipLoader.onLoadInit
外部ファイルを読込み終わってMovieClipLoader.onLoadCompleteイベントが発生し、かつロードされたSWFの第1フレームアクションが実行された後に呼出されます。したがって、ターゲットのMovieClipインスタンスのプロパティはもちろん、第1フレームアクションで定義したfunction(関数)にもアクセスが可能になります。このリスナーイベントを使えば第1フレームアクションのfunction(関数)が確実に呼出せるということも、MovieClipLoaderクラスを使用する利点です。

_____

作成者: 野中文雄
更新日: 2008年3月5日 注釈[*1]の同時接続数について[Flashcoders]の議論を追加。それにともない解説も一部変更。
更新日: 2007年2月22日 MovieClipLoader.onLoadInitリスナーイベントについて、MovieClipLoader.onLoadCompleteイベントとの順序を明記。
更新日: 2006年3月22日 Flash Player 8でMovieClipLoader.onLoadProgressイベントが[ムービープレビュー]でも発生するようになった点を追加。
更新日: 2006年3月18日 Flash Player 8からのMovieClipLoader.onLoadErrorの第3引数についての説明を追加。
更新日: 2006年1月22日 注釈[*1]を追加。
作成日: 2005年1月10日


Copyright © 2001-2008 Fumio Nonaka.  All rights reserved.