All pastes #459731 Raw Edit

Stuff

public text v1 · immutable
#459731 ·published 2007-04-26 17:29 UTC
rendered paste body
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();
	}
}