AS3ライブラリ BulkLoaderの使い方

今回は、ActionScript3.0のライブラリBulkLoaderに関する学習メモです。BulkLoaderを使えば、複数の外部ファイルを簡単に読み込むことができる上、精度のいい読み込みのパーセンテージの取得もできるようです。

まず、BulkLoaderを使用する場合は、importする必要があります。BulkLoaderクラスとBulkProgressEventクラスをimportします。

ActionScript3.0

import br.com.stimuli.loading.BulkLoader;
import br.com.stimuli.loading.BulkProgressEvent;

次にインスタンスを作成します。型はBulkLoader型で指定します。コンストラクタの引数でインスタンス名を指定しておくと、コンテンツを取得する際に使えるようです。下記のようにlogLevelを設定しておくとデバッグの際に便利ですが、動作確認できたらコメントアウトしましょう。

ActionScript3.0

var loader:BulkLoader = new BulkLoader("main-site");
loader.logLevel = BulkLoader.LOG_INFO;

BulkLoaderのインスタンスを作成したら、add()メソッドでロードするURLを追加していきます。第1引数はURLを文字列かURLRequestオブジェクトで指定します。第2引数は省略可能でオプションをObject型で指定します。一般的なオプションには下記のようなものがあります。

id
idを指定しておくと、コンテンツを取得する際にid名でアクセスできるようになります。id名が重複していてもコンパイルが通ってしまうので、重複しないように気を付けましょう。指定しなかった場合は、urlがidになるようです。
type
typeは拡張子からファイルタイプを判別できない場合は必須で、"image"などの文字列でも指定できますが、BulkLoaderクラスに用意されている定数で指定すると間違いがないでしょう。
priority
priorityで優先度を指定することができます。初期値は0で値が大きいほど優先してロードされます。
preventCache
preventCacheをtrueに設定するとurlにクエリーでランダム文字列を付加して、キャッシュされるのを防いでくれるようです。
maxTries
maxTriesでロードに失敗したときにリトライする回数を指定できます。初期値は3のようです。
weight
ロードのパーセンテージをweightPercentで取得する場合に設定します。初期値は1で値が大きいほど全体のパーセンテージに対する割合が大きくなります。

ActionScript3.0

loader.add("img/img001.jpg");
loader.add("img/img002.jpg", {id:"myImage"});
loader.add("img/img003", {type:BulkLoader.TYPE_IMAGE});
loader.add("sample.xml", {priority:10, preventCache:true});
loader.add("img/img005.jpg", {maxTries:5});
loader.add(new URLRequest("sound.mp3"), {id:"mySound", type:BulkLoader.TYPE_SOUND, maxTries:1, weight:20});

次にイベントリスナーを登録します。BulkLoader.PROGRESSは全ファイルの読み込み中に、BulkLoader.COMPLETEは全ファイルの読み込み完了時に、BulkLoader.ERRORはエラー発生時にイベントが発生します。また、get()メソッドでURLもしくはid名を指定して、個々のファイルの読み込みを監視することも可能です。

ActionScript3.0

loader.addEventListener(BulkLoader.PROGRESS, onProgress);
loader.addEventListener(BulkLoader.COMPLETE, onComplete);
loader.addEventListener(BulkLoader.ERROR, onError);
loader.get("img/img001.jpg").addEventListener(Event.COMPLETE, on001Loaded)
loader.get("myImage").addEventListener(Event.COMPLETE, on002Loaded)

続いてリスナー関数を定義します。onProgress()内では、BulkProgressEventからpercentLoaded, weightPercent, ratioLoadedをtrace()しています。onError()内では、removeFailedItems()でロードに失敗したアイテムを削除しています。削除しないといつまで経ってもCOMPLETEイベントが発生しないので、注意が必要です。

ActionScript3.0

function onProgress(e:BulkProgressEvent):void {
  trace("e.percentLoaded:", e.percentLoaded, "e.weightPercent:", e.weightPercent, "e.ratioLoaded:", e.ratioLoaded);
}

function onComplete(e:Event):void {
  loader.removeEventListener(BulkLoader.PROGRESS, onProgress);
  loader.removeEventListener(BulkLoader.COMPLETE, onComplete);
  loader.removeEventListener(BulkLoader.ERROR, onError);
  trace("全ファイルの読み込みが完了しました。");
  displayItems();
}

function onError(e:ErrorEvent):void {
  trace("エラーが発生しました。");
  loader.removeFailedItems();
}

function on001Loaded(e:Event):void {
  loader.get("img/img001.jpg").removeEventListener(Event.COMPLETE, on001Loaded)
  trace("img/img001.jpgの読み込みが完了しました。");
}

function on002Loaded(e:Event):void {
  loader.get("myImage").removeEventListener(Event.COMPLETE, on002Loaded)
  trace("img/img002.jpgの読み込みが完了しました。");
}

次は読み込んだコンテンツを取得します。BulkLoaderには、読み込んだコンテンツを取得するのにも様々な方法が用意されています。get系のメソッドの第2引数をtrueにすると取得と同時にメモリを解放してくれます。次の例では、コンテンツの取得後にloaderをtrace()していますが、第2引数をtrueにした場合はnullになっていることが確認できます。

ActionScript3.0

function displayItems():void {
  var xml:XML = loader.getXML("sample.xml", true);
  trace("loader.get(\"sample.xml\"):", loader.get("sample.xml"));
  trace("sample.xml:", xml);
  var img001:Bitmap = loader.getContent("img/img001.jpg", true) as Bitmap;
  trace("loader.get(\"img/img001.jpg\"):", loader.get("img/img001.jpg"));
  var img002:Bitmap = loader.getBitmap("myImage", true);
  trace("loader.get(\"myImage\"):", loader.get("myImage"));
  var img003:Bitmap = new Bitmap(BulkLoader.getLoader("main-site").getBitmapData("img/img003", true));
  trace("loader.get(\"img/img003\"):", loader.get("img/img003"));
  var img004:Bitmap = loader.get("img/img004.jpg").content;
  trace("loader.get(\"img/img004.jpg\"):", loader.get("img/img004.jpg"));
  var img_array:Array = new Array(img001, img002, img003, img004);
  var bitmap:Bitmap;
  for (var i:int = 0; i < img_array.length; i++) {
    bitmap = img_array[i];
    bitmap.width = 100;
    bitmap.scaleY = bitmap.scaleX;
    bitmap.x = 100 * i;
    addChild(bitmap);
  }
  var _sound:Sound = loader.getSound("mySound");
  trace("loader.get(\"mySound\"):", loader.get("mySound"));
  _sound.play(0, 10);
  removeLoaders();
}

BulkLoaderには、メモリ解放用のメソッドも用意されています。remove()は個々のリソース単位、removeAll()はインスタンス単位、removeAllLoaders()はstaticで呼び出すことですべてのインスタンスにおいて、メモリを解放してくれます。

ActionScript3.0

function removeLoaders():void {
  loader.remove("img/img004.jpg");
  trace("loader.get(\"img/img004.jpg\"):", loader.get("img/img004.jpg"));
  loader.removeAll();
  trace("loader.get(\"mySound\"):", loader.get("mySound"));
  BulkLoader.removeAllLoaders();
  trace("loader:", loader);
}

最後にstart()メソッドで読み込みを開始します。

ActionScript3.0

loader.start();

今回は試してみませんでしたが、BulkLoaderはFLVにも対応しているようです。機会があったら試してみたいと思います。