以前のエントリの更に続き。前のImagePreloderは読み込み予定のURLを登録した後にpreload()すると全部を一気に読み込み始める仕様だった。これだと全画面表示に使うような大きめの画像を読み込むとかなり負荷がかかって処理が落ちる。_visible=falseしてても描画をしてるんだろうか?
てことで一個づつ読み込むように変更。内容は以下のとおり。
class ImagePreloader
{
private var serial:Number;
private var imgSet:Array;
private var imgSetLength:Number;
private var preloader:MovieClip;
private var mcArray:Array;
private var mclArray:Array;
private var mclListener:Object;
private var loadedImgNum:Number=0;
private var callBackFunc:Function;
static var originalNum:Number = 0;
/*
第一引数…画像のURLを格納したArray
第二引数…コールバック関数
*/
public function ImagePreloader(img:Array, func:Function)
{
serial = originalNum++;
imgSet = img;
imgSetLength = img.length;
callBackFunc = func;
}
public function preload():Void
{
//プリロード用空MC
preloader = _root.createEmptyMovieClip(“preload” + serial, -9999 + serial);
preloader._visible = false;
//配列初期化
mcArray = [];
mclArray = [];
loadImg();
}
function loadImg()
{
var mcName:String = “preloadImg” + loadedImgNum;
mcArray[loadedImgNum] = preloader.createEmptyMovieClip(mcName, 1000 + loadedImgNum);
var mcl:MovieClipLoader = new MovieClipLoader();
mclArray[loadedImgNum] = mcl;
var imgPath = imgSet[loadedImgNum];
//イベントを受信できるようにする
mclArray[loadedImgNum].addListener(this);
mclArray[loadedImgNum].loadClip(imgPath,mcArray[loadedImgNum]);
}
//読み込み完了後のクリーニング関数
private function deletePreloader():Void
{
preloader.swapDepths(preloader._parent.getNextHighestDepth())
preloader.removeMovieClip();
}
private function onLoadInit ():Void
{
// ロード完了した画像数をインクリメント
loadedImgNum++;
// すべてロードしたらcallBackFunc内の関数を呼び出す
if (loadedImgNum >= imgSetLength)
{
deletePreloader();
callBackFunc();
}
// まだ残っていたら場合は次の画像を読み込みに行く
else
{
loadImg();
}
};
}
変数名が思いつかなくて、結局中身まんまの名前付けて変数名がスゲェ長くなることがあるんですけど…。分かりやすくてかっちょいい名前付けれるようになりたい…。