rendered paste bodyimport 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();
}
}