AssetLoader is a multi file/asset loader for AS3 built on AS3Signals. It provides an easy way to load multiple files.

Some features:

  • Automatic Type detection.
  • Multiple connections, which you can define.
  • No Events, AS3Signals only.
  • No singletons! Construct as many AssetLoaders as you want!
  • Data is dispatched with strong types. NO CASTING!
  • Endless recursive group loaders within loaders, within loaders, etc.
  • Pause/Resume/Destroy capabilities.
  • Dynamic parameter system that works with code completion – No guessing!
  • Loader parameters smartly inherit from their parent loaders, which mean you write less code.
  • Real-time loading stats. This provides latency, speed, average and progress of all downloads.
  • Consolidated stats, loaders reclusively consolidate loading stats all the way down to the last child.
  • Can be configured via XML, straight up or from an external file with one easy call.
  • All loader errors are consolidated to one signal. IOError, SecurityError, etc. – you don’t have to worry about it, they all boil down to one place. Which means you can “globally” handle loading errors with one listener/command.
  • Interfaces all round.
  • Unit tested!
  • Works super well with Robotlegs!
  • And some other stuff too!

Sample

package org.assetloader.example
{
	import org.assetloader.AssetLoader;
	import org.assetloader.core.IAssetLoader;
	import org.assetloader.core.ILoadStats;
	import org.assetloader.core.ILoader;
	import org.assetloader.signals.ErrorSignal;
	import org.assetloader.signals.LoaderSignal;

	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.utils.Dictionary;

	/**
	 * @author Matan Uberstein
	 */
	public class AddConfigExample extends Sprite
	{
		protected var _assetloader : IAssetLoader;

		public function AddConfigExample()
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			initConsole();

			_assetloader = new AssetLoader();

			// Passing config as a URL.
			_assetloader.addConfig("simple-queue-config.xml");

			// Because we are passing the config as a URL, we need wait until AssetLoader fires onConfigLoaded before stating the queue.
			_assetloader.onConfigLoaded.add(onConfigLoaded_handler);

			// Add listeners
			addListenersToLoader(_assetloader);
		}

		// --------------------------------------------------------------------------------------------------------------------------------//
		// HANDLERS
		// --------------------------------------------------------------------------------------------------------------------------------//
		protected function onConfigLoaded_handler(signal : LoaderSignal) : void
		{
			// Do your clean up!
			_assetloader.onConfigLoaded.remove(onConfigLoaded_handler);

			// Start!
			_assetloader.start();
		}

		protected function onChildOpen_handler(signal : LoaderSignal, child : ILoader) : void
		{
			trace("[" + signal.loader.id + "]\t[" + child.id + "]\t\topened  \tLatency\t: " + Math.floor(child.stats.latency) + "\tms");
		}

		protected function onChildError_handler(signal : ErrorSignal, child : ILoader) : void
		{
			trace("[" + signal.loader.id + "]\t[" + child.id + "]\t\terror  \tType\t: " + signal.type + " | Message: " + signal.message);
		}

		protected function onChildComplete_handler(signal : LoaderSignal, child : ILoader) : void
		{
			trace("[" + signal.loader.id + "]\t[" + child.id + "]\t\tcomplete\tSpeed\t: " + Math.floor(child.stats.averageSpeed) + "\tkbps");
		}

		protected function onComplete_handler(signal : LoaderSignal, assets : Dictionary) : void
		{
			var loader : IAssetLoader = IAssetLoader(signal.loader);

			// Do your clean up!
			removeListenersFromLoader(loader);

			// Our Primary AssetLoader's stats.
			var stats : ILoadStats = loader.stats;

			trace("\n[" + loader.id + "]");
			trace("LOADING COMPLETE:");
			trace("Total Time: " + stats.totalTime + " ms");
			trace("Average Latency: " + Math.floor(stats.latency) + " ms");
			trace("Average Speed: " + Math.floor(stats.averageSpeed) + " kbps");
			trace("Total Bytes: " + stats.bytesTotal);
		}

		// --------------------------------------------------------------------------------------------------------------------------------//
		// ADD / REMOVE LISTENERS
		// --------------------------------------------------------------------------------------------------------------------------------//
		protected function addListenersToLoader(loader : IAssetLoader) : void
		{
			loader.onChildOpen.add(onChildOpen_handler);
			loader.onChildError.add(onChildError_handler);
			loader.onChildComplete.add(onChildComplete_handler);

			loader.onComplete.add(onComplete_handler);
		}

		protected function removeListenersFromLoader(loader : IAssetLoader) : void
		{
			loader.onChildOpen.remove(onChildOpen_handler);
			loader.onChildError.remove(onChildError_handler);
			loader.onChildComplete.remove(onChildComplete_handler);

			loader.onComplete.remove(onComplete_handler);
		}
	}
}
Loaders . URL.