Improve Assets, use Futures and Events

This commit is contained in:
Joshua Granick
2015-09-04 09:35:00 -07:00
parent 0e7b5fa056
commit 9b266891dd
3 changed files with 253 additions and 306 deletions

View File

@@ -3,7 +3,9 @@ package;
import haxe.Timer;
import haxe.Unserializer;
import lime.app.Future;
import lime.app.Preloader;
import lime.app.Promise;
import lime.audio.AudioSource;
import lime.audio.openal.AL;
import lime.audio.AudioBuffer;
@@ -26,6 +28,8 @@ import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.media.Sound;
import flash.net.URLLoader;
import flash.net.URLRequest;
@@ -112,11 +116,7 @@ class DefaultAssetLibrary extends AssetLibrary {
lastModified = modified;
loadManifest ();
if (eventCallback != null) {
eventCallback (this, "change");
}
onChange.dispatch ();
}
@@ -492,7 +492,9 @@ class DefaultAssetLibrary extends AssetLibrary {
}
public override function loadAudioBuffer (id:String, handler:AudioBuffer -> Void):Void {
public override function loadAudioBuffer (id:String):Future<AudioBuffer> {
var promise = new Promise<AudioBuffer> ();
#if (flash)
@@ -503,28 +505,45 @@ class DefaultAssetLibrary extends AssetLibrary {
var audioBuffer:AudioBuffer = new AudioBuffer();
audioBuffer.src = event.currentTarget;
handler (audioBuffer);
promise.complete (audioBuffer);
});
soundLoader.addEventListener (ProgressEvent.PROGRESS, function (event) {
if (event.bytesTotal == 0) {
promise.progress (0);
} else {
promise.progress (event.bytesLoaded / event.bytesTotal);
}
});
soundLoader.addEventListener (IOErrorEvent.IO_ERROR, promise.error);
soundLoader.load (new URLRequest (path.get (id)));
} else {
handler (getAudioBuffer (id));
promise.complete (getAudioBuffer (id));
}
#else
handler (getAudioBuffer (id));
promise.complete (getAudioBuffer (id));
#end
return promise.future;
}
public override function loadBytes (id:String, handler:ByteArray -> Void):Void {
public override function loadBytes (id:String):Future<ByteArray> {
var promise = new Promise<ByteArray> ();
#if flash
@@ -537,14 +556,28 @@ class DefaultAssetLibrary extends AssetLibrary {
bytes.writeUTFBytes (event.currentTarget.data);
bytes.position = 0;
handler (bytes);
promise.complete (bytes);
});
loader.addEventListener (ProgressEvent.PROGRESS, function (event) {
if (event.bytesTotal == 0) {
promise.progress (0);
} else {
promise.progress (event.bytesLoaded / event.bytesTotal);
}
});
loader.addEventListener (IOErrorEvent.IO_ERROR, promise.error);
loader.load (new URLRequest (path.get (id)));
} else {
handler (getBytes (id));
promise.complete (getBytes (id));
}
@@ -556,15 +589,32 @@ class DefaultAssetLibrary extends AssetLibrary {
loader.dataFormat = BINARY;
loader.onComplete.add (function (_):Void {
handler (loader.data);
promise.complete (loader.data);
});
loader.onProgress.add (function (_, loaded, total) {
if (total == 0) {
promise.progress (0);
} else {
promise.progress (loaded / total);
}
});
loader.onIOError.add (function (_, e) {
promise.error (e);
});
loader.load (new URLRequest (path.get (id)));
} else {
handler (getBytes (id));
promise.complete (getBytes (id));
}
@@ -576,14 +626,18 @@ class DefaultAssetLibrary extends AssetLibrary {
}
threadPool.queue (id, { handler: handler, getMethod: getBytes });
threadPool.queue (id, { promise: promise, getMethod: getBytes });
#end
return promise.future;
}
public override function loadImage (id:String, handler:Image -> Void):Void {
public override function loadImage (id:String):Future<Image> {
var promise = new Promise<Image> ();
#if flash
@@ -593,14 +647,28 @@ class DefaultAssetLibrary extends AssetLibrary {
loader.contentLoaderInfo.addEventListener (Event.COMPLETE, function (event:Event) {
var bitmapData = cast (event.currentTarget.content, Bitmap).bitmapData;
handler (Image.fromBitmapData (bitmapData));
promise.complete (Image.fromBitmapData (bitmapData));
});
loader.contentLoaderInfo.addEventListener (ProgressEvent.PROGRESS, function (event) {
if (event.bytesTotal == 0) {
promise.progress (0);
} else {
promise.progress (event.bytesLoaded / event.bytesTotal);
}
});
loader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, promise.error);
loader.load (new URLRequest (path.get (id)));
} else {
handler (getImage (id));
promise.complete (getImage (id));
}
@@ -611,14 +679,15 @@ class DefaultAssetLibrary extends AssetLibrary {
var image = new js.html.Image ();
image.onload = function (_):Void {
handler (Image.fromImageElement (image));
promise.complete (Image.fromImageElement (image));
}
image.onerror = promise.error;
image.src = path.get (id);
} else {
handler (getImage (id));
promise.complete (getImage (id));
}
@@ -630,10 +699,12 @@ class DefaultAssetLibrary extends AssetLibrary {
}
threadPool.queue (id, { handler: handler, getMethod: getImage });
threadPool.queue (id, { promise: promise, getMethod: getImage });
#end
return promise.future;
}
@@ -703,36 +774,9 @@ class DefaultAssetLibrary extends AssetLibrary {
#end
/*public override function loadMusic (id:String, handler:Dynamic -> Void):Void {
public override function loadText (id:String):Future<String> {
#if (flash || html5)
//if (path.exists (id)) {
// var loader = new Loader ();
// loader.contentLoaderInfo.addEventListener (Event.COMPLETE, function (event) {
// handler (cast (event.currentTarget.content, Bitmap).bitmapData);
// });
// loader.load (new URLRequest (path.get (id)));
//} else {
handler (getMusic (id));
//}
#else
handler (getMusic (id));
#end
}*/
public override function loadText (id:String, handler:String -> Void):Void {
var promise = new Promise<String> ();
#if html5
@@ -741,38 +785,55 @@ class DefaultAssetLibrary extends AssetLibrary {
var loader = new URLLoader ();
loader.onComplete.add (function (_):Void {
handler (loader.data);
promise.complete (loader.data);
});
loader.onProgress.add (function (_, loaded, total) {
if (total == 0) {
promise.progress (0);
} else {
promise.progress (loaded / total);
}
});
loader.onIOError.add (function (_, msg) promise.error (msg));
loader.load (new URLRequest (path.get (id)));
} else {
handler (getText (id));
promise.complete (getText (id));
}
#else
var callback = function (bytes:ByteArray):Void {
promise.completeWith (loadBytes (id).then (function (bytes) {
if (bytes == null) {
return new Future<String> (function () {
handler (null);
if (bytes == null) {
return null;
} else {
return bytes.readUTFBytes (bytes.length);
}
} else {
handler (bytes.readUTFBytes (bytes.length));
}
});
}
loadBytes (id, callback);
}));
#end
return promise.future;
}