Improve Assets, use Futures and Events
This commit is contained in:
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user