trinAssetLoader.js 5.0 KB

1
  1. function TrinAssetLoader(onComplete, onP) { if (onComplete === undefined) { onComplete = null; } if (onP === undefined) { onP = null; } this.currentAsset = 0; this.assetsToLoad = []; this.onComplete = onComplete; this.onP = onP; this.caller = null; this.partSize = 0; this.currentProgress = 0; } TrinAssetLoader.prototype = { TYPE_IMAGE: 0, TYPE_SOUND: 1, TYPE_JSON: 2, LOADED_JSON: [], addImage: function(name, src, animated) { if (animated === undefined) { animated = true; } this.assetsToLoad.push({ name: name, src: src, type: this.TYPE_IMAGE, animated: animated }); }, addSound: function(name, src) { this.assetsToLoad.push({ name: name, src: src, type: this.TYPE_SOUND }); }, addJson: function(name, src) { this.assetsToLoad.push({ name: name, src: src, type: this.TYPE_JSON }); }, load: function() { var loader; if (this.loader === undefined) { loader = this; } else { loader = this.loader; switch (this.info.type) { case loader.TYPE_IMAGE: this.onload = null; this.onprocess = null; TrinAnimation.prototype.addImage(this); if (!this.info.animated) { TrinAnimation.prototype.makeAnimation(this.info.name, this.info.name); } break; case loader.TYPE_SOUND: this.removeEventListener("canplay", loader.load, true); TrinSound.prototype.add(this); break; case loader.TYPE_JSON: TrinAssetLoader.prototype.LOADED_JSON[this.info.name] = this; break; } this.loader = null; this.info = null; } if (loader.currentAsset === loader.assetsToLoad.length) { loader.loadingEnded(); loader.process(loader, 1); return; } loader.currentProgress = loader.currentAsset / loader.assetsToLoad.length; loader.process(loader, loader.currentProgress); var info = loader.assetsToLoad[loader.currentAsset++]; switch (info.type) { case loader.TYPE_IMAGE: var image = new Image(); image.loader = loader; image.onload = loader.load; image.onprogress = function(event) { var loader = arguments.callee.loader; loader.process(loader.currentProgress + loader.partSize * (event.loaded / event.total)); }; image.onprogress.loader = loader; image.info = info; image.src = info.src; break; case loader.TYPE_SOUND: var sound = new Audio(); sound.loader = loader; sound.info = info; var src; src = document.createElement("source"); src.setAttribute("src", info.src + ".mp3"); src.setAttribute("type", "audio/mpeg"); sound.appendChild(src); src = document.createElement("source"); src.setAttribute("src", info.src + ".ogg"); src.setAttribute("type", "audio/ogg"); sound.appendChild(src); sound.addEventListener("canplay", loader.load, true); sound.load(); break; case loader.TYPE_JSON: var onLoad = function(json) { var obj = JSON.parse(json); obj.loader = arguments.callee.loader; obj.info = arguments.callee.info; obj.loader.load.apply(obj); }; onLoad.loader = loader; onLoad.info = info; loader.loadJson(info.src, onLoad); break; } }, loadingEnded: function() { this.currentImage = 0; this.assetsToLoad = []; if (this.onComplete !== null) { this.onComplete(); } }, process: function(loader, percent) { if (loader.onP !== null) { loader.onP(percent); } }, loadJson: function(url, callback) { var xobj = new XMLHttpRequest(); xobj.overrideMimeType("application/json"); xobj.open('GET', url, true); xobj.onreadystatechange = function() { if (xobj.readyState === 4 && xobj.status === 200) { callback(xobj.responseText); xobj.onreadystatechange = null; } }; xobj.send(null); }, getLoadedJson: function(name) { return TrinAssetLoader.prototype.LOADED_JSON[name]; } };