Flashで画像のプリローダクラスを作ってみた。メインの画面に移行する前に表示予定の画像を全部読み込んでキャッシュしとくって時に使う予定。
画像はMovieClipLoader経由で一回読み込んでおけばキャッシュに保存されるってのを利用する。動作としては次のとおり。
画像のURLを配列で与える。
↓
プリローディング用のMovieClipが_rootに作られる。
↓
画像枚数分のMovieClipLoaderが準備される。
↓
MovieClipLoaderにURLが放り込まれて、プリローディング用のMovieClipに画像が読み込まれる。
↓
画像をすべて読み込み終わったらコールバック関数を実行。
ステップはこれだけなので簡単かと思いきや、リスナー用のオブジェクトにクラス内の変数や関数を渡す方法が分からなくて苦労した。今回はオブジェクト内に変数を作ってイベントハンドラを経由せずに直接代入する方法をとった。
mclListener = new Object();
mclListener.loadedCompleteImgNum = 0;
mclListener.loadImgNum = imgSetLength;
mclListener.callBack = callBackFunc;
mclListener.clean = deletePreloader;
mclListener.onLoadInit = function()
{
this.loadedCompleteImgNum++;
if (this.loadedCompleteImgNum >= this.loadImgNum)
{
this.clean();
this.callBack();
}
};
クラスの関数をリスナーオブジェクト内で実行する為に、わざわざオブジェクト内に変数用意して外部で受け取ってってのがなかなかめんどくさい。これどう考えてもスマートじゃない。
余裕があったらEventDispatcherで読み込み枚数の配信機能もつけようと思ったけど、これもオブジェクトのデータのやり取りがややこしくって実現できず。
どうもこのオブジェクトと外のデータのやり取りのスコープの変化に惑わされていまいちピンときてない。ちょっとこの辺勉強してみる。