Macromedia Flash非公式テクニカルノート MovieClip.loadMovieで外部ファイルを読込む
Platform: All 1. MovieClip.loadMovieメソッド
同階層にある外部SWFファイルtest.swfを、メインのタイムラインからMovieClipインスタンスmy_mcにロードする場合には、フレームアクションをつぎのように記述します(スクリプト001)。 スクリプト001■MovieClip.loadMovie()メソッドで外部SWFをロード
ロードされる外部ファイルは、ターゲットに指定したMovieClipの基準点を左上隅として配置されます。ですから、ターゲットのMovieClipは、初めから基準点を左上隅に設定しておくと、位置が合わせやすいです。 2. 外部ファイルの読込みを待つ たとえば、位置座標のMovieClip._xやMovieClip._yプロパティなら、読込みの完了を待つ必要はなく、MovieClip.loadMovieメソッド実行直後に設定することができます。ところが、幅や高さのMovieClip._widthやMovieClip._heightプロパティは、ロード実行直後に値を調べると、外部ファイルを読込む前の元のMovieClipの値が返されてしまいます。したがって、読込んだファイルのサイズを取得して処理を行う場合には、読込みを待つ必要があります。あるいは、MovieClip.gotoAndPlayメソッドで指定フレームから再生したい場合、メソッド自体は使用可能です。しかし、指定フレームの読込みが済んでいなければ、メソッドは空振りに終わり、何も実行されません(メソッドは無視されます)。 外部ファイルのロード完了を待つには、onClipEvent (data)イベントハンドラアクションを使用します。ただし、onClipEvent (data)イベントハンドラでは、ひとかたまりの「各データセクションが読み込まれるたびに、dataイベントが繰り返し発生します」(Flash MX「ActionScript辞書」のonClipEventの項参照)。つまり、容量の大きなSWFファイルを読込むときには、dataイベントが何度も発生することがあるのです。
そこで、onClipEvent (data)イベントハンドラ内で、データがすべて読込まれたかどうかの判定の処理が必要になります。その判定のために使用するのがMovieClip.getBytesTotalとMovieClip.getBytesLoadedの2つのメソッドです。前者はターゲットに指定した MovieClip全体のサイズを、後者はロード(ストリーミング)されたバイト数を返します。 ロードされたバイト数がMovieClip全体のバイト数に達したときに、ムービーのロードが完了したことになります。onClipEvent (data)イベントハンドラの中にifアクションを記述して、この2つの値を比較して判定すればよいでしょう。 外部SWFムービーのロードが完了するのを待って、指定フレームから再生するサンプルスクリプトが以下です(スクリプト002)。外部SWFムービーのロードは、メインのタイムラインのフレームアクションから実行します。SWFムービーをロードするターゲットは、メインのタイムラインに配置したMovieClipインスタンスmy_mcです。_root.my_mcに、ロード待ちのMovieClipアクションを設定します。 スクリプト002■onClipEvent (data)ハンドラで外部ファイルのロードを待つ
[1] onClipEvent (data)イベントハンドラアクションで、データの読込みをイベントとして受取ります。外部SWFムービーをロードするので、dataイベントは複数回発生する可能性があります。 [2] MovieClip.getBytesTotalメソッドが返すロードしたSWFムービー全体のサイズと、MovieClip.getBytesLoadedメソッドから取得した読込み済みバイト数とを比較して、ロードの完了を確認します。 なお、MovieClip.loadMovieメソッドで外部SWFムービーのロードを開始した瞬間には、環境によって「MovieClip.getBytesTotal」メソッドが0を返すことがあります。そうすると、その時点では「MovieClip.getBytesLoaded」の戻り値も0なので、2つの値の比較だけではロードが完了したという判定になってしまいます。そこで、if条件をひとつ追加して、MovieClip.getBytesTotalメソッドの戻り値が0より大きいことを確認しています。 [3] ロード完了が確認できたら、完了後の処理を実行します。このサンプルでは、フレームラベル"start"に移動して、ムービーを再生します。 [4] ロード待ちの間、行う処理を記述します。ここでは、再生が先に進まないように、再生ヘッドを停止しています。 3. MovieClip.loadMovieで外部ファイルを読込む際の注意 たとえば、ロードを実行する前にインスタンスの位置座標をそのMovieClipの変数に設定しても、ロードした時点で変数はクリアされて未定義(undefined)になってしまいます。ですから、ロード中の処理をステージ外で行って、読込み終わったら元の位置に戻そうと思っても、変数に設定した位置座標はメモリから消えているということになります。
MovieClipの外部からインスタンスに設定したイベントハンドラメソッドも、外部SWFをロードするとクリアされます。イベントハンドラメソッドが外部SWFムービー内のフレームアクションに記述してあれば、もちろんロード後も有効です。
MovieClip._widthやMovieClip._heightプロパティについては、外部ファイルの読込み実行時には、元のMovieClipインスタンスの値を返します。その後プロパティはクリアされ、外部ファイルがロードされるとそのサイズに更新されます。ですから、読込み後のインスタンスの幅や高さを変更したい場合には、値が更新された後に設定する必要があります(更新前に設定すると、元のMovieClipインスタンスを基準に変形を行うため、意図したサイズに設定できません)。
MovieClipの定義済みプロパティについては、個別に確認する必要があります。MovieClip._xやMovieClip._yプロパティは、前述のとおり、ロード実行の前後をとおして問題なく取得・設定が可能です。これに対して、MovieClip._visibleプロパティは、読込み前あるいはその直後にfalseに設定しても、ロードされればtrueにリセットされます。 なお、onClipEvent (load)ハンドラでMovieClip自身をターゲットにloadMovieを実行することは避けましょう。外部SWFムービーをロードすると、MovieClipの内容が置き換わるので、onClipEvent (load)イベントハンドラが1度実行されます。したがって、このハンドラの中でそのMovieClip自身をターゲットとしてMovieClip.loadMovieメソッドを実行していると、無限に同じ処理を繰返すことになってしまいます。 ロードの処理が実行されたことをMovieClipインスタンスの変数(フラグ)に記録して、処理の循環を回避することもできません。MovieClipがロードされると、ユーザーが設定した変数やプロパティはクリアされてしまうからです。しいてこの方法を採るとするなら、変数はインスタンスの外部に設定する必要があります。ただ、スクリプトとしてあまりスマートとはいえないでしょう。 さらに、複数の外部ファイルをMovieClip.loadMovie()メソッドで、同時に読込むべきではありません。サーバーが同時に読込めるファイル数には制限があり、仮にその制限内あってもタイムアウトの発生などロードを妨げる要因が発生しやすくなります。外部ファイルのロードはひとつずつ、その完了を確認したうえで行っていくスクリプティングが必要とされます。Flash Player 7以降を対象とする場合には、MovieClipLoaderクラスを利用するのが簡単でしょう。
_____ 作成者: 野中文雄 Copyright © 2001-2006 Fumio Nonaka. All rights reserved. |
||||||||||||