import com.stevensacks.utils.ObservableClip; import com.stevensacks.galapagos.assets.AbstractAsset; import mx.utils.Delegate; class com.stevensacks.galapagos.assets.AssetPreloader extends ObservableClip { private var container:MovieClip; private var assets:Array; private var loadObj:Object; private var eachPerc:Number; private var progressDelegate:Function; private var completeDelegate:Function; function AssetPreloader() { super(); _visible = false; progressDelegate = Delegate.create(this, onAssetProgress); completeDelegate = Delegate.create(this, onAssetComplete); init(); } public function load(assetObj:Object):Void { for (var a:String in assetObj) { assets.push(assetObj[a]); } var i:Number = assets.length; eachPerc = 100 / i; var asset:AbstractAsset; while (i--) { asset = assets[i]; loadObj[asset.id] = {}; loadObj[asset.id].title = asset.title; loadObj[asset.id].complete = asset.loaded; } loadNextAsset(); } private function init():Void { assets = []; loadObj = {}; container.removeMovieClip(); this.createEmptyMovieClip("container", 1); } private function loadNextAsset():Void { if (!asset.loaded) loadAsset(asset); } private function loadAsset(asset:AbstractAsset):Void { asset.addEventListener("progress", progressDelegate); asset.addEventListener("complete", completeDelegate); var mc:MovieClip = container.createEmptyMovieClip(asset.id, container.getNextHighestDepth()); asset.load(mc); } private function onAssetProgress(evt:Object):Void { loadObj[evt.id].loaded = evt.loaded; loadObj[evt.id].total = evt.total; loadObj[evt.id].perc = evt.perc; } private function onAssetComplete(evt:Object):Void { loadObj[evt.id].complete = true; checkAllComplete(); } private function checkAllComplete():Void { var allComplete:Boolean = true; for (var a:String in loadObj) { if (!loadObj[a].complete) allComplete = false; } if (allComplete) dispatchComplete(); } private function dispatchProgress():Void { var l:Number = 0; var t:Number = 0; var p:Number = 0; for (var a:String in loadObj) { l += loadObj[a].loaded; t += loadObj[a].total; p += !loadObj.complete ? Math.round((eachPerc * loadObj[a].perc) * 100) : eachPerc; } dispatchEvent({type:"progress", loaded:l, total:t, perc:p, data:loadObj}); } private function dispatchComplete():Void { var i:Number = assets.length; var asset:AbstractAsset; while (i--) { asset = assets[i]; asset.removeEventListener("progress", progressDelegate); asset.removeEventListener("complete", completeDelegate); } dispatchEvent({type:"complete"}); init(); } }