package loader { import flash.display.BitmapData; import flash.display.Loader; import flash.display.Bitmap; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.ProgressEvent; import flash.events.IOErrorEvent; import flash.net.URLLoader; import flash.net.URLRequest; import flash.utils.Dictionary; import loader.LoaderCollectionEvent; public dynamic class LoaderCollection extends EventDispatcher { private var _contents:Array; private var patternImg:RegExp; private var patternXml:RegExp; private var loadCount:int = 0; private var loadedRate:Number = 0; private var loaderArray:Array; private var loadFiles:int = 0; private var loadedObjects:Dictionary = new Dictionary(); private var loaded:Boolean = false; private var _length:uint = 0; public function LoaderCollection(contents:Array) { _contents = contents; loadFiles = _contents.length; patternImg = /\.(jpe?g|gif|png)$/i; patternXml = /\.(dae|xml|txt)$/i; loaderArray = new Array(); for (var i:int = 0; i < loadFiles; i++) { if (patternImg.test(_contents[i])) { loaderArray[i] = new Loader(); loaderArray[i].contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress); loaderArray[i].contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); loaderArray[i].contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIoError); }else if (patternXml.test(_contents[i])) { loaderArray[i] = new URLLoader(); loaderArray[i].addEventListener(ProgressEvent.PROGRESS, onProgress); loaderArray[i].addEventListener(Event.COMPLETE, onComplete); loaderArray[i].addEventListener(IOErrorEvent, onIoError); } } } public function load():void { if(loadFiles > 0){ var request:URLRequest = new URLRequest(_contents[loadCount]); loaderArray[loadCount].load(request); }else { dispatchEvent(new LoaderCollectionEvent(LoaderCollectionEvent.COMPLETE, 1)); } } private function onProgress(e:ProgressEvent):void { loadedRate = ((e.bytesLoaded / e.bytesTotal) + loadCount) / loadFiles; dispatchEvent(new LoaderCollectionEvent(LoaderCollectionEvent.PROGRESS, loadedRate)); } private function onComplete(e:Event):void { loadCount++; _length++; if (loadCount == loadFiles) { loadComplete(); }else { load(); } } private function loadComplete():void { //LoaderCollection.loadedObjects = new Dictionary(); for (var i:uint = 0; i < loadFiles; i++) { var ar:Array = _contents[i].split("/"); var fileName:String = ar[ar.length - 1]; if (patternImg.test(_contents[i])) { loadedObjects[fileName] = Bitmap(loaderArray.shift().content); }else if (patternXml.test(_contents[i])) { loadedObjects[fileName] = XML(loaderArray.shift().data); } } loaded = true; dispatchEvent(new LoaderCollectionEvent(LoaderCollectionEvent.COMPLETE, 1)); } public function content(fileName:String):* { if (loaded) { if(loadedObjects.hasOwnProperty(fileName)){ return loadedObjects[fileName]; }else { return new Bitmap(new BitmapData(10, 10, false, 0x666666)); //throw new Error("指定されたファイルがありません"); //return null; } }else { return new Bitmap(new BitmapData(10, 10, false, 0x666666)); //throw new Error("読み込みが完了していません"); //return null; } } public function slice(startIndex:uint = 0, endIndex:uint = uint.MAX_VALUE):Array { var array:Array = new Array(); if(loaded) { if (startIndex < length) { endIndex = endIndex <= length ? endIndex : length; var index:uint = 0; for each(var b:* in loadedObjects) { if (startIndex <= index && index <= endIndex) { array.push(b); } index++; } } } return array; } public function getLoadedObjectAt(index:uint):* { if (loaded && index < length) { var i:uint = 0; for each(var obj:* in loadedObjects) { if (i == index) { return obj; }else { i++; } } } return null; } public function get length():uint { return _length; } public function destroy():void { for (var i:uint = 0; i < loadFiles; i++) { var ar:Array = _contents[i].split("/"); var fileName:String = ar[ar.length - 1]; if (patternImg.test(fileName)) { loadedObjects[fileName].bitmapData.dispose(); } loadedObjects[fileName] = null; } } private function onIoError(e:IOErrorEvent):void { dispatchEvent(new LoaderCollectionEvent.IO_ERROR); loadCount++; load(); } } }