複数ファイルのローダ
ファイルひとつをロードする場合、 Loader クラスの COMPLETE イベントで簡単にロード完了を待つ事ができます。
ですが、複数のファイルをロードしたい場合、それだけではうまくいきません。
以下、私が考えた方法を記述。
コード
package { import flash.display.Loader; import flash.net.URLRequest; import flash.system.ApplicationDomain; import flash.system.LoaderContext; import flash.events.Event; import flash.events.EventDispatcher; public class FileLoader extends EventDispatcher { // カスタムイベントの完了通知 public static const LOAD_COMPLETE:String = "load_complete"; // ロードするファイル数のカウンタ private var counter:int; // ファイルを格納する連想配列 private var fileHash:Object = new Object(); // LoaderContext を定義しておく private var context:LoaderContext; // FileLoader public function FileLoader(fileAry:Array) { // LoaderContext の初期化 context = new LoaderContext(); context.applicationDomain = ApplicationDomain.currentDomain; // ロードされるファイル数をセット counter = fileAry.length; // fileAry で指定されたファイルをすべてロード for each(var fileObj:Object in fileAry) { loadFile(fileObj); } } // ファイルのロード private function loadFile(fileObj):void { var myLoader:Loader = new Loader; var myRequest:URLRequest = new URLRequest(fileObj.path); fileHash[fileObj.fileName] = myLoader; myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, informComplete); myLoader.load(myRequest, context); } // ロード完了時イベント private function informComplete(event:Event):void { event.target.removeEventListener(Event.COMPLETE, informComplete); // 未ロードのファイルの存在を確認し、なければ LOAD_COMPLETE を通知 if(--counter <= 0) dispatchEvent(new Event(LOAD_COMPLETE)); } // ロードしたファイルを返す public function getFiles():Object { return fileHash; } } }
利用サンプル
var fileAry = [ {path : "misao.jpg", fileName : "misaoLoader"} , {path : "yuki_2.jpg", fileName : "nagatoLoader"} ] var fileLoader = new FileLoader(fileAry); fileLoader.addEventListener(FileLoader.LOAD_COMPLETE, onComp); function onComp(event:Event):void { event.target.removeEventListener(FileLoader.LOAD_COMPLETE, onComp); var files = fileLoader.getFiles(); addChild(files.misaoLoader); }
改善ポイント
- Object のキーは取得できないのか?
- 使うかどうかはともかく、キーを取得できるなら別の書き方もできるかも。
- Loader 以外のクラスに対応していない(Sound とか)
- ファイルのパスの他に、形式も指定させるとか。
- エラー処理
- 手抜きました、すいません。
まとめ
やはり実際に一個アプリを作った後だと、色々思いつく事が多いですね。
今からでも遅くないし、リファクタリングしてしまおうかな?
これがベストとは思えないので、もっとうまいやり方をご存知の方は、是非ご教授願います。
後、はてな記法で ActionScript のファイルタイプって何を指定すればいいんでしょうか。。。