mirror of
https://github.com/photonstorm/phaser
synced 2025-01-05 17:58:48 +00:00
Merge branch 'master' into rendering-cleanup
This commit is contained in:
commit
e98c6b336a
44 changed files with 1090 additions and 675 deletions
|
@ -182,6 +182,18 @@ var Config = new Class({
|
||||||
this.physics = GetValue(config, 'physics', {});
|
this.physics = GetValue(config, 'physics', {});
|
||||||
this.defaultPhysicsSystem = GetValue(this.physics, 'default', false);
|
this.defaultPhysicsSystem = GetValue(this.physics, 'default', false);
|
||||||
|
|
||||||
|
// Loader Defaults
|
||||||
|
this.loaderBaseURL = GetValue(config, 'loader.baseURL', '');
|
||||||
|
this.loaderPath = GetValue(config, 'loader.path', '');
|
||||||
|
this.loaderEnableParallel = GetValue(config, 'loader.enableParallel', true);
|
||||||
|
this.loaderMaxParallelDownloads = GetValue(config, 'loader.maxParallelDownloads', 4);
|
||||||
|
this.loaderCrossOrigin = GetValue(config, 'loader.crossOrigin', undefined);
|
||||||
|
this.loaderResponseType = GetValue(config, 'loader.responseType', '');
|
||||||
|
this.loaderAsync = GetValue(config, 'loader.async', true);
|
||||||
|
this.loaderUser = GetValue(config, 'loader.user', '');
|
||||||
|
this.loaderPassword = GetValue(config, 'loader.password', '');
|
||||||
|
this.loaderTimeout = GetValue(config, 'loader.timeout', 0);
|
||||||
|
|
||||||
// Scene Plugins
|
// Scene Plugins
|
||||||
this.defaultPlugins = GetValue(config, 'plugins', DefaultScenePlugins);
|
this.defaultPlugins = GetValue(config, 'plugins', DefaultScenePlugins);
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ var DebugHeader = function (game)
|
||||||
|
|
||||||
var renderType = (config.renderType === CONST.CANVAS) ? 'Canvas' : 'WebGL';
|
var renderType = (config.renderType === CONST.CANVAS) ? 'Canvas' : 'WebGL';
|
||||||
|
|
||||||
var audioConfig = game.config.audio;
|
var audioConfig = config.audio;
|
||||||
var deviceAudio = game.device.Audio;
|
var deviceAudio = game.device.Audio;
|
||||||
|
|
||||||
var audioType;
|
var audioType;
|
||||||
|
@ -105,7 +105,7 @@ var DebugHeader = function (game)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep this during dev build only
|
// Keep this during dev build only
|
||||||
console.log(CHECKSUM.build);
|
// console.log(CHECKSUM.build);
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = DebugHeader;
|
module.exports = DebugHeader;
|
||||||
|
|
|
@ -14,6 +14,7 @@ Point.Floor = require('./Floor');
|
||||||
Point.GetCentroid = require('./GetCentroid');
|
Point.GetCentroid = require('./GetCentroid');
|
||||||
Point.GetMagnitude = require('./GetMagnitude');
|
Point.GetMagnitude = require('./GetMagnitude');
|
||||||
Point.GetMagnitudeSq = require('./GetMagnitudeSq');
|
Point.GetMagnitudeSq = require('./GetMagnitudeSq');
|
||||||
|
Point.GetRectangleFromPoints = require('./GetRectangleFromPoints');
|
||||||
Point.Interpolate = require('./Interpolate');
|
Point.Interpolate = require('./Interpolate');
|
||||||
Point.Invert = require('./Invert');
|
Point.Invert = require('./Invert');
|
||||||
Point.Multiply = require('./Multiply');
|
Point.Multiply = require('./Multiply');
|
||||||
|
|
|
@ -48,6 +48,9 @@ var File = new Class({
|
||||||
this.xhrSettings = MergeXHRSettings(this.xhrSettings, GetFastValue(fileConfig, 'xhrSettings', {}));
|
this.xhrSettings = MergeXHRSettings(this.xhrSettings, GetFastValue(fileConfig, 'xhrSettings', {}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The LoaderPlugin instance that is loading this file
|
||||||
|
this.loader = null;
|
||||||
|
|
||||||
this.xhrLoader = null;
|
this.xhrLoader = null;
|
||||||
|
|
||||||
this.state = CONST.FILE_PENDING;
|
this.state = CONST.FILE_PENDING;
|
||||||
|
@ -70,8 +73,6 @@ var File = new Class({
|
||||||
// Multipart file? (i.e. an atlas and its json together)
|
// Multipart file? (i.e. an atlas and its json together)
|
||||||
this.linkFile = undefined;
|
this.linkFile = undefined;
|
||||||
this.linkType = '';
|
this.linkType = '';
|
||||||
|
|
||||||
this.callback = null;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
resetXHR: function ()
|
resetXHR: function ()
|
||||||
|
@ -81,20 +82,54 @@ var File = new Class({
|
||||||
this.xhrLoader.onprogress = undefined;
|
this.xhrLoader.onprogress = undefined;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Called when the Image loads
|
// Called by the Loader, starts the actual file downloading.
|
||||||
// ProgressEvent
|
// During the load the methods onLoad, onProgress, etc are called based on the XHR events.
|
||||||
|
load: function (loader)
|
||||||
|
{
|
||||||
|
this.loader = loader;
|
||||||
|
|
||||||
|
if (this.state === CONST.FILE_POPULATED)
|
||||||
|
{
|
||||||
|
this.onComplete();
|
||||||
|
|
||||||
|
loader.nextFile(this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.src = GetURL(this, loader.baseURL);
|
||||||
|
|
||||||
|
if (this.src.indexOf('data:') === 0)
|
||||||
|
{
|
||||||
|
console.log('Local data URI');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.xhrLoader = XHRLoader(this, loader.xhr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Called when the file loads, is sent a DOM ProgressEvent
|
||||||
onLoad: function (event)
|
onLoad: function (event)
|
||||||
{
|
{
|
||||||
this.resetXHR();
|
this.resetXHR();
|
||||||
|
|
||||||
this.callback(this, true);
|
if (event.target && event.target.status !== 200)
|
||||||
|
{
|
||||||
|
this.loader.nextFile(this, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.loader.nextFile(this, true);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Called when the file errors, is sent a DOM ProgressEvent
|
||||||
onError: function (event)
|
onError: function (event)
|
||||||
{
|
{
|
||||||
this.resetXHR();
|
this.resetXHR();
|
||||||
|
|
||||||
this.callback(this, false);
|
this.loader.nextFile(this, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
onProgress: function (event)
|
onProgress: function (event)
|
||||||
|
@ -105,11 +140,14 @@ var File = new Class({
|
||||||
this.bytesTotal = event.total;
|
this.bytesTotal = event.total;
|
||||||
|
|
||||||
this.percentComplete = Math.min((this.bytesLoaded / this.bytesTotal), 1);
|
this.percentComplete = Math.min((this.bytesLoaded / this.bytesTotal), 1);
|
||||||
}
|
|
||||||
|
|
||||||
// console.log(this.percentComplete + '% (' + this.bytesLoaded + ' bytes)');
|
// console.log(this.percentComplete + '% (' + this.bytesLoaded + ' bytes)');
|
||||||
|
this.loader.emit('fileprogress', this, this.percentComplete);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Usually overriden by the FileTypes and is called by Loader.finishedLoading.
|
||||||
|
// The callback is Loader.processUpdate
|
||||||
onProcess: function (callback)
|
onProcess: function (callback)
|
||||||
{
|
{
|
||||||
this.state = CONST.FILE_PROCESSING;
|
this.state = CONST.FILE_PROCESSING;
|
||||||
|
@ -139,25 +177,6 @@ var File = new Class({
|
||||||
{
|
{
|
||||||
this.state = CONST.FILE_COMPLETE;
|
this.state = CONST.FILE_COMPLETE;
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
// Called by the Loader, starts the actual file downloading
|
|
||||||
load: function (callback, baseURL, globalXHR)
|
|
||||||
{
|
|
||||||
if (baseURL === undefined) { baseURL = ''; }
|
|
||||||
|
|
||||||
this.callback = callback;
|
|
||||||
|
|
||||||
this.src = GetURL(this, baseURL);
|
|
||||||
|
|
||||||
if (this.src.indexOf('data:') === 0)
|
|
||||||
{
|
|
||||||
console.log('Local data URI');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.xhrLoader = XHRLoader(this, globalXHR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
27
src/loader/FileTypesManager.js
Normal file
27
src/loader/FileTypesManager.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
var types = {};
|
||||||
|
|
||||||
|
var FileTypesManager = {
|
||||||
|
|
||||||
|
install: function (loader)
|
||||||
|
{
|
||||||
|
for (var key in types)
|
||||||
|
{
|
||||||
|
loader[key] = types[key];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
register: function (key, factoryFunction)
|
||||||
|
{
|
||||||
|
types[key] = factoryFunction;
|
||||||
|
|
||||||
|
// console.log('FileTypesManager.register', key);
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function ()
|
||||||
|
{
|
||||||
|
types = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = FileTypesManager;
|
|
@ -1,337 +0,0 @@
|
||||||
var BaseLoader = require('./BaseLoader');
|
|
||||||
var Class = require('../utils/Class');
|
|
||||||
var CONST = require('./const');
|
|
||||||
var NumberArray = require('../utils/array/NumberArray');
|
|
||||||
var PluginManager = require('../plugins/PluginManager');
|
|
||||||
var TILEMAP_FORMATS = require('../gameobjects/tilemap/Formats');
|
|
||||||
|
|
||||||
// TODO - Injection mapped
|
|
||||||
var AnimationJSONFile = require('./filetypes/AnimationJSONFile');
|
|
||||||
var AtlasJSONFile = require('./filetypes/AtlasJSONFile');
|
|
||||||
var AudioFile = require('./filetypes/AudioFile');
|
|
||||||
var BinaryFile = require('./filetypes/BinaryFile');
|
|
||||||
var BitmapFontFile = require('./filetypes/BitmapFontFile');
|
|
||||||
var GLSLFile = require('./filetypes/GLSLFile');
|
|
||||||
var HTMLFile = require('./filetypes/HTMLFile');
|
|
||||||
var ImageFile = require('./filetypes/ImageFile');
|
|
||||||
var JSONFile = require('./filetypes/JSONFile');
|
|
||||||
var PluginFile = require('./filetypes/PluginFile');
|
|
||||||
var ScriptFile = require('./filetypes/ScriptFile');
|
|
||||||
var SpriteSheet = require('./filetypes/SpriteSheet');
|
|
||||||
var SVGFile = require('./filetypes/SVGFile');
|
|
||||||
var TextFile = require('./filetypes/TextFile');
|
|
||||||
var TilemapCSVFile = require('./filetypes/TilemapCSVFile');
|
|
||||||
var TilemapJSONFile = require('./filetypes/TilemapJSONFile');
|
|
||||||
var UnityAtlasFile = require('./filetypes/UnityAtlasFile');
|
|
||||||
var WavefrontFile = require('./filetypes/WavefrontFile');
|
|
||||||
var XMLFile = require('./filetypes/XMLFile');
|
|
||||||
|
|
||||||
var Loader = new Class({
|
|
||||||
|
|
||||||
Extends: BaseLoader,
|
|
||||||
|
|
||||||
initialize:
|
|
||||||
|
|
||||||
function Loader (scene)
|
|
||||||
{
|
|
||||||
BaseLoader.call(this, scene);
|
|
||||||
|
|
||||||
this.systems = scene.sys;
|
|
||||||
|
|
||||||
if (!scene.sys.settings.isBooted)
|
|
||||||
{
|
|
||||||
scene.sys.events.once('boot', this.boot, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._multilist = {};
|
|
||||||
},
|
|
||||||
|
|
||||||
boot: function ()
|
|
||||||
{
|
|
||||||
var eventEmitter = this.systems.events;
|
|
||||||
|
|
||||||
eventEmitter.on('shutdown', this.shutdown, this);
|
|
||||||
eventEmitter.on('destroy', this.destroy, this);
|
|
||||||
},
|
|
||||||
|
|
||||||
// key can be either a string, an object or an array of objects
|
|
||||||
|
|
||||||
image: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return ImageFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
animation: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return AnimationJSONFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
json: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return JSONFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
script: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return ScriptFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
plugin: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return PluginFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
xml: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return XMLFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
binary: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return BinaryFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
text: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return TextFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
glsl: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return GLSLFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
html: function (key, url, width, height, xhrSettings)
|
|
||||||
{
|
|
||||||
return HTMLFile.create(this, key, url, width, height, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
svg: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return SVGFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
obj: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return WavefrontFile.create(this, key, url, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
// config can include: frameWidth, frameHeight, startFrame, endFrame, margin, spacing
|
|
||||||
spritesheet: function (key, url, config, xhrSettings)
|
|
||||||
{
|
|
||||||
return SpriteSheet.create(this, key, url, config, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
// config can include: instances
|
|
||||||
audio: function (key, urls, config, xhrSettings)
|
|
||||||
{
|
|
||||||
var audioFile = AudioFile.create(this, key, urls, config, xhrSettings);
|
|
||||||
|
|
||||||
if(audioFile)
|
|
||||||
{
|
|
||||||
this.addFile(audioFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
tilemapCSV: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return TilemapCSVFile.create(this, key, url, TILEMAP_FORMATS.CSV, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
tilemapTiledJSON: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return TilemapJSONFile.create(this, key, url, TILEMAP_FORMATS.TILED_JSON, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
tilemapWeltmeister: function (key, url, xhrSettings)
|
|
||||||
{
|
|
||||||
return TilemapJSONFile.create(this, key, url, TILEMAP_FORMATS.WELTMEISTER, xhrSettings);
|
|
||||||
},
|
|
||||||
|
|
||||||
// ---------------------------------------------------
|
|
||||||
// Multi-File Loaders
|
|
||||||
// ---------------------------------------------------
|
|
||||||
|
|
||||||
audioSprite: function (key, urls, json, config, audioXhrSettings, jsonXhrSettings)
|
|
||||||
{
|
|
||||||
var audioFile = AudioFile.create(this, key, urls, config, audioXhrSettings);
|
|
||||||
|
|
||||||
if(audioFile)
|
|
||||||
{
|
|
||||||
var jsonFile;
|
|
||||||
|
|
||||||
if (typeof json === 'string')
|
|
||||||
{
|
|
||||||
jsonFile = new JSONFile(key, json, this.path, jsonXhrSettings);
|
|
||||||
|
|
||||||
this.addFile(jsonFile);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
jsonFile = {
|
|
||||||
type: 'json',
|
|
||||||
key: key,
|
|
||||||
data: json,
|
|
||||||
state: CONST.FILE_WAITING_LINKFILE
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Link them together
|
|
||||||
audioFile.linkFile = jsonFile;
|
|
||||||
jsonFile.linkFile = audioFile;
|
|
||||||
|
|
||||||
// Set the type
|
|
||||||
audioFile.linkType = 'audioSprite';
|
|
||||||
jsonFile.linkType = 'audioSprite';
|
|
||||||
|
|
||||||
this.addFile(audioFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
unityAtlas: function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
|
|
||||||
{
|
|
||||||
// Returns an object with two properties: 'texture' and 'data'
|
|
||||||
var files = new UnityAtlasFile(key, textureURL, atlasURL, this.path, textureXhrSettings, atlasXhrSettings);
|
|
||||||
|
|
||||||
this.addFile(files.texture);
|
|
||||||
this.addFile(files.data);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
atlas: function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
|
|
||||||
{
|
|
||||||
// Returns an object with two properties: 'texture' and 'data'
|
|
||||||
var files = new AtlasJSONFile(key, textureURL, atlasURL, this.path, textureXhrSettings, atlasXhrSettings);
|
|
||||||
|
|
||||||
this.addFile(files.texture);
|
|
||||||
this.addFile(files.data);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
bitmapFont: function (key, textureURL, xmlURL, textureXhrSettings, xmlXhrSettings)
|
|
||||||
{
|
|
||||||
// Returns an object with two properties: 'texture' and 'data'
|
|
||||||
var files = new BitmapFontFile(key, textureURL, xmlURL, this.path, textureXhrSettings, xmlXhrSettings);
|
|
||||||
|
|
||||||
this.addFile(files.texture);
|
|
||||||
this.addFile(files.data);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
multiatlas: function (key, textureURLs, atlasURLs, textureXhrSettings, atlasXhrSettings)
|
|
||||||
{
|
|
||||||
if (typeof textureURLs === 'number')
|
|
||||||
{
|
|
||||||
var total = textureURLs;
|
|
||||||
var suffix = (atlasURLs === undefined) ? '' : atlasURLs;
|
|
||||||
|
|
||||||
textureURLs = NumberArray(0, total, key + suffix, '.png');
|
|
||||||
atlasURLs = NumberArray(0, total, key + suffix, '.json');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!Array.isArray(textureURLs))
|
|
||||||
{
|
|
||||||
textureURLs = [ textureURLs ];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Array.isArray(atlasURLs))
|
|
||||||
{
|
|
||||||
atlasURLs = [ atlasURLs ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var file;
|
|
||||||
var i = 0;
|
|
||||||
var multiKey;
|
|
||||||
|
|
||||||
this._multilist[key] = [];
|
|
||||||
|
|
||||||
for (i = 0; i < textureURLs.length; i++)
|
|
||||||
{
|
|
||||||
multiKey = '_MA_IMG_' + key + '_' + i.toString();
|
|
||||||
|
|
||||||
file = new ImageFile(multiKey, textureURLs[i], this.path, textureXhrSettings);
|
|
||||||
|
|
||||||
this.addFile(file);
|
|
||||||
|
|
||||||
this._multilist[key].push(multiKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < atlasURLs.length; i++)
|
|
||||||
{
|
|
||||||
multiKey = '_MA_JSON_' + key + '_' + i.toString();
|
|
||||||
|
|
||||||
file = new JSONFile(multiKey, atlasURLs[i], this.path, atlasXhrSettings);
|
|
||||||
|
|
||||||
this.addFile(file);
|
|
||||||
|
|
||||||
this._multilist[key].push(multiKey);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
loadArray: function (files)
|
|
||||||
{
|
|
||||||
if (Array.isArray(files))
|
|
||||||
{
|
|
||||||
for (var i = 0; i < files.length; i++)
|
|
||||||
{
|
|
||||||
this.file(files[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (this.list.size > 0);
|
|
||||||
},
|
|
||||||
|
|
||||||
file: function (file)
|
|
||||||
{
|
|
||||||
var entry;
|
|
||||||
|
|
||||||
switch (file.type)
|
|
||||||
{
|
|
||||||
case 'spritesheet':
|
|
||||||
entry = this.spritesheet(file.key, file.url, file.config, file.xhrSettings);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'atlas':
|
|
||||||
entry = this.atlas(file.key, file.textureURL, file.atlasURL, file.textureXhrSettings, file.atlasXhrSettings);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'bitmapFont':
|
|
||||||
entry = this.bitmapFont(file.key, file.textureURL, file.xmlURL, file.textureXhrSettings, file.xmlXhrSettings);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'multiatlas':
|
|
||||||
entry = this.multiatlas(file.key, file.textureURLs, file.atlasURLs, file.textureXhrSettings, file.atlasXhrSettings);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'audioSprite':
|
|
||||||
entry = this.audioSprite(file.key, file.urls, file.json, file.config, file.audioXhrSettings, file.jsonXhrSettings);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// image, json, xml, binary, text, glsl, svg, obj
|
|
||||||
default:
|
|
||||||
entry = this[file.type](file.key, file.url, file.xhrSettings);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return entry;
|
|
||||||
},
|
|
||||||
|
|
||||||
shutdown: function ()
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
PluginManager.register('Loader', Loader, 'load');
|
|
||||||
|
|
||||||
module.exports = Loader;
|
|
|
@ -2,39 +2,63 @@ var Class = require('../utils/Class');
|
||||||
var CONST = require('./const');
|
var CONST = require('./const');
|
||||||
var CustomSet = require('../structs/Set');
|
var CustomSet = require('../structs/Set');
|
||||||
var EventEmitter = require('eventemitter3');
|
var EventEmitter = require('eventemitter3');
|
||||||
|
var FileTypesManager = require('./FileTypesManager');
|
||||||
|
var GetFastValue = require('../utils/object/GetFastValue');
|
||||||
var ParseXMLBitmapFont = require('../gameobjects/bitmaptext/ParseXMLBitmapFont');
|
var ParseXMLBitmapFont = require('../gameobjects/bitmaptext/ParseXMLBitmapFont');
|
||||||
|
var PluginManager = require('../plugins/PluginManager');
|
||||||
var XHRSettings = require('./XHRSettings');
|
var XHRSettings = require('./XHRSettings');
|
||||||
|
|
||||||
// Phaser.Loader.BaseLoader
|
// Phaser.Loader.LoaderPlugin
|
||||||
|
|
||||||
// To finish the loader ...
|
var LoaderPlugin = new Class({
|
||||||
//
|
|
||||||
// 3) Progress update
|
|
||||||
|
|
||||||
var BaseLoader = new Class({
|
|
||||||
|
|
||||||
Extends: EventEmitter,
|
Extends: EventEmitter,
|
||||||
|
|
||||||
initialize:
|
initialize:
|
||||||
|
|
||||||
function BaseLoader (scene)
|
function LoaderPlugin (scene)
|
||||||
{
|
{
|
||||||
EventEmitter.call(this);
|
EventEmitter.call(this);
|
||||||
|
|
||||||
this.scene = scene;
|
this.scene = scene;
|
||||||
|
|
||||||
// Move to a 'setURL' method?
|
this.systems = scene.sys;
|
||||||
this.baseURL = '';
|
|
||||||
this.path = '';
|
|
||||||
|
|
||||||
// Read from Game / Scene Config
|
if (!scene.sys.settings.isBooted)
|
||||||
this.enableParallel = true;
|
{
|
||||||
this.maxParallelDownloads = 4;
|
scene.sys.events.once('boot', this.boot, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._multilist = {};
|
||||||
|
|
||||||
|
// Inject the available filetypes into the Loader
|
||||||
|
FileTypesManager.install(this);
|
||||||
|
|
||||||
|
var gameConfig = this.systems.game.config;
|
||||||
|
var sceneConfig = this.systems.settings.loader;
|
||||||
|
|
||||||
|
this.path = '';
|
||||||
|
this.baseURL = '';
|
||||||
|
|
||||||
|
this.setBaseURL(GetFastValue(sceneConfig, 'baseURL', gameConfig.loaderBaseURL));
|
||||||
|
this.setPath(GetFastValue(sceneConfig, 'path', gameConfig.loaderPath));
|
||||||
|
|
||||||
|
this.enableParallel = GetFastValue(sceneConfig, 'enableParallel', gameConfig.loaderEnableParallel);
|
||||||
|
this.maxParallelDownloads = GetFastValue(sceneConfig, 'maxParallelDownloads', gameConfig.loaderMaxParallelDownloads);
|
||||||
|
|
||||||
// xhr specific global settings (can be overridden on a per-file basis)
|
// xhr specific global settings (can be overridden on a per-file basis)
|
||||||
this.xhr = XHRSettings();
|
this.xhr = XHRSettings(
|
||||||
|
GetFastValue(sceneConfig, 'responseType', gameConfig.loaderResponseType),
|
||||||
|
GetFastValue(sceneConfig, 'async', gameConfig.loaderAsync),
|
||||||
|
GetFastValue(sceneConfig, 'user', gameConfig.loaderUser),
|
||||||
|
GetFastValue(sceneConfig, 'password', gameConfig.loaderPassword),
|
||||||
|
GetFastValue(sceneConfig, 'timeout', gameConfig.loaderTimeout)
|
||||||
|
);
|
||||||
|
|
||||||
this.crossOrigin = undefined;
|
this.crossOrigin = GetFastValue(sceneConfig, 'crossOrigin', gameConfig.loaderCrossOrigin);
|
||||||
|
|
||||||
|
this.totalToLoad = 0;
|
||||||
|
this.progress = 0;
|
||||||
|
|
||||||
this.list = new CustomSet();
|
this.list = new CustomSet();
|
||||||
this.inflight = new CustomSet();
|
this.inflight = new CustomSet();
|
||||||
|
@ -45,9 +69,29 @@ var BaseLoader = new Class({
|
||||||
this.state = CONST.LOADER_IDLE;
|
this.state = CONST.LOADER_IDLE;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
boot: function ()
|
||||||
|
{
|
||||||
|
var eventEmitter = this.systems.events;
|
||||||
|
|
||||||
|
eventEmitter.on('shutdown', this.shutdown, this);
|
||||||
|
eventEmitter.on('destroy', this.destroy, this);
|
||||||
|
},
|
||||||
|
|
||||||
|
setBaseURL: function (url)
|
||||||
|
{
|
||||||
|
if (url !== '' && url.substr(-1) !== '/')
|
||||||
|
{
|
||||||
|
url = url.concat('/');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.baseURL = url;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
setPath: function (path)
|
setPath: function (path)
|
||||||
{
|
{
|
||||||
if (path.substr(-1) !== '/')
|
if (path !== '' && path.substr(-1) !== '/')
|
||||||
{
|
{
|
||||||
path = path.concat('/');
|
path = path.concat('/');
|
||||||
}
|
}
|
||||||
|
@ -85,13 +129,16 @@ var BaseLoader = new Class({
|
||||||
|
|
||||||
start: function ()
|
start: function ()
|
||||||
{
|
{
|
||||||
console.log(this.scene.sys.settings.key, '- BaseLoader start. Files to load:', this.list.size);
|
// console.log(this.scene.sys.settings.key, '- Loader start. Files to load:', this.list.size);
|
||||||
|
|
||||||
if (!this.isReady())
|
if (!this.isReady())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.progress = 0;
|
||||||
|
this.totalToLoad = this.list.size;
|
||||||
|
|
||||||
this.emit('start', this);
|
this.emit('start', this);
|
||||||
|
|
||||||
if (this.list.size === 0)
|
if (this.list.size === 0)
|
||||||
|
@ -116,18 +163,22 @@ var BaseLoader = new Class({
|
||||||
|
|
||||||
updateProgress: function ()
|
updateProgress: function ()
|
||||||
{
|
{
|
||||||
|
this.progress = 1 - (this.list.size / this.totalToLoad);
|
||||||
|
|
||||||
|
// console.log(this.progress);
|
||||||
|
|
||||||
|
this.emit('progress', this.progress);
|
||||||
},
|
},
|
||||||
|
|
||||||
processLoadQueue: function ()
|
processLoadQueue: function ()
|
||||||
{
|
{
|
||||||
// console.log('======== BaseLoader processLoadQueue');
|
// console.log('======== LoaderPlugin processLoadQueue');
|
||||||
// console.log('List size', this.list.size);
|
// console.log('List size', this.list.size);
|
||||||
// console.log(this.inflight.size, 'items still in flight. Can load another', (this.maxParallelDownloads - this.inflight.size));
|
// console.log(this.inflight.size, 'items still in flight. Can load another', (this.maxParallelDownloads - this.inflight.size));
|
||||||
|
|
||||||
this.list.each(function (file)
|
this.list.each(function (file)
|
||||||
{
|
{
|
||||||
if (file.state === CONST.FILE_PENDING && this.inflight.size < this.maxParallelDownloads)
|
if (file.state === CONST.FILE_POPULATED || (file.state === CONST.FILE_PENDING && this.inflight.size < this.maxParallelDownloads))
|
||||||
{
|
{
|
||||||
this.inflight.set(file);
|
this.inflight.set(file);
|
||||||
|
|
||||||
|
@ -157,7 +208,7 @@ var BaseLoader = new Class({
|
||||||
file.crossOrigin = this.crossOrigin;
|
file.crossOrigin = this.crossOrigin;
|
||||||
}
|
}
|
||||||
|
|
||||||
file.load(this.nextFile.bind(this), this.baseURL);
|
file.load(this);
|
||||||
},
|
},
|
||||||
|
|
||||||
nextFile: function (previousFile, success)
|
nextFile: function (previousFile, success)
|
||||||
|
@ -168,15 +219,19 @@ var BaseLoader = new Class({
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
|
this.emit('load', previousFile);
|
||||||
this.queue.set(previousFile);
|
this.queue.set(previousFile);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
this.emit('loaderror', previousFile);
|
||||||
this.failed.set(previousFile);
|
this.failed.set(previousFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.inflight.delete(previousFile);
|
this.inflight.delete(previousFile);
|
||||||
|
|
||||||
|
this.updateProgress();
|
||||||
|
|
||||||
if (this.list.size > 0)
|
if (this.list.size > 0)
|
||||||
{
|
{
|
||||||
// console.log('nextFile - still something in the list');
|
// console.log('nextFile - still something in the list');
|
||||||
|
@ -191,23 +246,32 @@ var BaseLoader = new Class({
|
||||||
|
|
||||||
finishedLoading: function ()
|
finishedLoading: function ()
|
||||||
{
|
{
|
||||||
// console.log('---> BaseLoader.finishedLoading PROCESSING', this.queue.size, 'files');
|
// console.log('---> LoaderPlugin.finishedLoading PROCESSING', this.queue.size, 'files');
|
||||||
|
|
||||||
if(this.state === CONST.LOADER_PROCESSING)
|
if (this.state === CONST.LOADER_PROCESSING)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.progress = 1;
|
||||||
|
|
||||||
this.state = CONST.LOADER_PROCESSING;
|
this.state = CONST.LOADER_PROCESSING;
|
||||||
|
|
||||||
this.storage.clear();
|
this.storage.clear();
|
||||||
|
|
||||||
this.queue.each(function (file)
|
if (this.queue.size === 0)
|
||||||
{
|
{
|
||||||
// console.log('%c Calling process on ' + file.key, 'color: #000000; background: #ffff00;');
|
// Everything failed, so nothing to process
|
||||||
|
this.processComplete();
|
||||||
file.onProcess(this.processUpdate.bind(this));
|
}
|
||||||
}, this);
|
else
|
||||||
|
{
|
||||||
|
this.queue.each(function (file)
|
||||||
|
{
|
||||||
|
// console.log('%c Calling process on ' + file.key, 'color: #000000; background: #ffff00;');
|
||||||
|
file.onProcess(this.processUpdate.bind(this));
|
||||||
|
}, this);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// Called automatically by the File when it has finished processing
|
// Called automatically by the File when it has finished processing
|
||||||
|
@ -266,7 +330,7 @@ var BaseLoader = new Class({
|
||||||
|
|
||||||
processComplete: function ()
|
processComplete: function ()
|
||||||
{
|
{
|
||||||
console.log(this.scene.sys.settings.key, '- Loader Complete. Loaded:', this.storage.size, 'Failed:', this.failed.size);
|
// console.log(this.scene.sys.settings.key, '- Loader Complete. Loaded:', this.storage.size, 'Failed:', this.failed.size);
|
||||||
|
|
||||||
this.list.clear();
|
this.list.clear();
|
||||||
this.inflight.clear();
|
this.inflight.clear();
|
||||||
|
@ -474,7 +538,7 @@ var BaseLoader = new Class({
|
||||||
if (filename === undefined) { filename = 'file.json'; }
|
if (filename === undefined) { filename = 'file.json'; }
|
||||||
if (filetype === undefined) { filetype = 'application/json'; }
|
if (filetype === undefined) { filetype = 'application/json'; }
|
||||||
|
|
||||||
var blob = new Blob([data], { type: filetype });
|
var blob = new Blob([ data ], { type: filetype });
|
||||||
|
|
||||||
var url = URL.createObjectURL(blob);
|
var url = URL.createObjectURL(blob);
|
||||||
|
|
||||||
|
@ -497,15 +561,74 @@ var BaseLoader = new Class({
|
||||||
this.storage.clear();
|
this.storage.clear();
|
||||||
|
|
||||||
this.removeAllListeners('start');
|
this.removeAllListeners('start');
|
||||||
|
this.removeAllListeners('load');
|
||||||
|
this.removeAllListeners('loaderror');
|
||||||
this.removeAllListeners('complete');
|
this.removeAllListeners('complete');
|
||||||
|
|
||||||
this.tag = '';
|
var gameConfig = this.systems.game.config;
|
||||||
this.path = '';
|
var sceneConfig = this.systems.settings.loader;
|
||||||
this.baseURL = '';
|
|
||||||
|
this.setBaseURL(GetFastValue(sceneConfig, 'baseURL', gameConfig.loaderBaseURL));
|
||||||
|
this.setPath(GetFastValue(sceneConfig, 'path', gameConfig.loaderPath));
|
||||||
|
|
||||||
this.state = CONST.LOADER_IDLE;
|
this.state = CONST.LOADER_IDLE;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
loadArray: function (files)
|
||||||
|
{
|
||||||
|
if (Array.isArray(files))
|
||||||
|
{
|
||||||
|
for (var i = 0; i < files.length; i++)
|
||||||
|
{
|
||||||
|
this.file(files[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (this.list.size > 0);
|
||||||
|
},
|
||||||
|
|
||||||
|
file: function (file)
|
||||||
|
{
|
||||||
|
var entry;
|
||||||
|
var key = file.key;
|
||||||
|
|
||||||
|
switch (file.type)
|
||||||
|
{
|
||||||
|
case 'spritesheet':
|
||||||
|
entry = this.spritesheet(key, file.url, file.config, file.xhrSettings);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'atlas':
|
||||||
|
entry = this.atlas(key, file.textureURL, file.atlasURL, file.textureXhrSettings, file.atlasXhrSettings);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'bitmapFont':
|
||||||
|
entry = this.bitmapFont(key, file.textureURL, file.xmlURL, file.textureXhrSettings, file.xmlXhrSettings);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'multiatlas':
|
||||||
|
entry = this.multiatlas(key, file.textureURLs, file.atlasURLs, file.textureXhrSettings, file.atlasXhrSettings);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'audioSprite':
|
||||||
|
entry = this.audioSprite(key, file.urls, file.json, file.config, file.audioXhrSettings, file.jsonXhrSettings);
|
||||||
|
break;
|
||||||
|
|
||||||
|
// image, json, xml, binary, text, glsl, svg, obj
|
||||||
|
default:
|
||||||
|
entry = this[file.type](key, file.url, file.xhrSettings);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
},
|
||||||
|
|
||||||
|
shutdown: function ()
|
||||||
|
{
|
||||||
|
this.reset();
|
||||||
|
this.state = CONST.LOADER_SHUTDOWN;
|
||||||
|
},
|
||||||
|
|
||||||
destroy: function ()
|
destroy: function ()
|
||||||
{
|
{
|
||||||
this.reset();
|
this.reset();
|
||||||
|
@ -514,4 +637,6 @@ var BaseLoader = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = BaseLoader;
|
PluginManager.register('Loader', LoaderPlugin, 'load');
|
||||||
|
|
||||||
|
module.exports = LoaderPlugin;
|
|
@ -4,17 +4,38 @@ var FILE_CONST = {
|
||||||
LOADER_LOADING: 1,
|
LOADER_LOADING: 1,
|
||||||
LOADER_PROCESSING: 2,
|
LOADER_PROCESSING: 2,
|
||||||
LOADER_COMPLETE: 3,
|
LOADER_COMPLETE: 3,
|
||||||
LOADER_DESTROYED: 4,
|
LOADER_SHUTDOWN: 4,
|
||||||
|
LOADER_DESTROYED: 5,
|
||||||
|
|
||||||
FILE_PENDING: 5, // file is in the load queue but not yet started
|
// File is in the load queue but not yet started
|
||||||
FILE_LOADING: 6, // file has been started to load by the loader (onLoad called)
|
FILE_PENDING: 10,
|
||||||
FILE_LOADED: 7, // file has loaded successfully, awaiting processing
|
|
||||||
FILE_FAILED: 8, // file failed to load
|
// File has been started to load by the loader (onLoad called)
|
||||||
FILE_PROCESSING: 9, // file is being processed (onProcess callback)
|
FILE_LOADING: 11,
|
||||||
FILE_WAITING_LINKFILE: 10, // file is being processed (onProcess callback)
|
|
||||||
FILE_ERRORED: 11, // file is being processed (onProcess callback)
|
// File has loaded successfully, awaiting processing
|
||||||
FILE_COMPLETE: 12, // file has finished processing
|
FILE_LOADED: 12,
|
||||||
FILE_DESTROYED: 13, // file has been destroyed
|
|
||||||
|
// File failed to load
|
||||||
|
FILE_FAILED: 13,
|
||||||
|
|
||||||
|
// File is being processed (onProcess callback)
|
||||||
|
FILE_PROCESSING: 14,
|
||||||
|
|
||||||
|
// File is being processed (onProcess callback)
|
||||||
|
FILE_WAITING_LINKFILE: 15,
|
||||||
|
|
||||||
|
// File is being processed (onProcess callback)
|
||||||
|
FILE_ERRORED: 16,
|
||||||
|
|
||||||
|
// File has finished processing
|
||||||
|
FILE_COMPLETE: 17,
|
||||||
|
|
||||||
|
// File has been destroyed
|
||||||
|
FILE_DESTROYED: 18,
|
||||||
|
|
||||||
|
// File was populated from local data and doesn't need an HTTP request
|
||||||
|
FILE_POPULATED: 19,
|
||||||
|
|
||||||
TEXTURE_ATLAS_JSON_ARRAY: 20,
|
TEXTURE_ATLAS_JSON_ARRAY: 20,
|
||||||
TEXTURE_ATLAS_JSON_HASH: 21
|
TEXTURE_ATLAS_JSON_HASH: 21
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var JSONFile = require('./JSONFile.js');
|
var JSONFile = require('./JSONFile.js');
|
||||||
|
|
||||||
|
// Phaser.Loader.FileTypes.AnimationJSONFile
|
||||||
|
|
||||||
var AnimationJSONFile = function (key, url, path, xhrSettings)
|
var AnimationJSONFile = function (key, url, path, xhrSettings)
|
||||||
{
|
{
|
||||||
var json = new JSONFile(key, url, path, xhrSettings);
|
var json = new JSONFile(key, url, path, xhrSettings);
|
||||||
|
@ -10,23 +13,29 @@ var AnimationJSONFile = function (key, url, path, xhrSettings)
|
||||||
return json;
|
return json;
|
||||||
};
|
};
|
||||||
|
|
||||||
AnimationJSONFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('animation', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new AnimationJSONFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new AnimationJSONFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new AnimationJSONFile(key, url, loader.path, xhrSettings));
|
this.addFile(new AnimationJSONFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = AnimationJSONFile;
|
module.exports = AnimationJSONFile;
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var ImageFile = require('./ImageFile.js');
|
var ImageFile = require('./ImageFile.js');
|
||||||
var JSONFile = require('./JSONFile.js');
|
var JSONFile = require('./JSONFile.js');
|
||||||
|
|
||||||
|
// Phaser.Loader.FileTypes.AtlasJSONFile
|
||||||
|
|
||||||
var AtlasJSONFile = function (key, textureURL, atlasURL, path, textureXhrSettings, atlasXhrSettings)
|
var AtlasJSONFile = function (key, textureURL, atlasURL, path, textureXhrSettings, atlasXhrSettings)
|
||||||
{
|
{
|
||||||
var image = new ImageFile(key, textureURL, path, textureXhrSettings);
|
var image = new ImageFile(key, textureURL, path, textureXhrSettings);
|
||||||
|
@ -17,4 +20,15 @@ var AtlasJSONFile = function (key, textureURL, atlasURL, path, textureXhrSetting
|
||||||
return { texture: image, data: data };
|
return { texture: image, data: data };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
FileTypesManager.register('atlas', function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
|
||||||
|
{
|
||||||
|
// Returns an object with two properties: 'texture' and 'data'
|
||||||
|
var files = new AtlasJSONFile(key, textureURL, atlasURL, this.path, textureXhrSettings, atlasXhrSettings);
|
||||||
|
|
||||||
|
this.addFile(files.texture);
|
||||||
|
this.addFile(files.data);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = AtlasJSONFile;
|
module.exports = AtlasJSONFile;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
var CONST = require('../../const');
|
var CONST = require('../../const');
|
||||||
var HTML5AudioFile = require('./HTML5AudioFile');
|
var HTML5AudioFile = require('./HTML5AudioFile');
|
||||||
|
@ -60,7 +61,7 @@ var AudioFile = new Class({
|
||||||
|
|
||||||
AudioFile.create = function (loader, key, urls, config, xhrSettings)
|
AudioFile.create = function (loader, key, urls, config, xhrSettings)
|
||||||
{
|
{
|
||||||
var game = loader.scene.game;
|
var game = loader.systems.game;
|
||||||
var audioConfig = game.config.audio;
|
var audioConfig = game.config.audio;
|
||||||
var deviceAudio = game.device.Audio;
|
var deviceAudio = game.device.Audio;
|
||||||
|
|
||||||
|
@ -78,13 +79,33 @@ AudioFile.create = function (loader, key, urls, config, xhrSettings)
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio))
|
if (deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio))
|
||||||
{
|
{
|
||||||
return new AudioFile(key, url, loader.path, xhrSettings, game.sound.context);
|
return new AudioFile(key, url, this.path, xhrSettings, game.sound.context);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new HTML5AudioFile(key, url, this.path, config, game.sound.locked);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('audio', function (key, urls, config, xhrSettings)
|
||||||
|
{
|
||||||
|
var audioFile = AudioFile.create(this, key, urls, config, xhrSettings);
|
||||||
|
|
||||||
|
if (audioFile)
|
||||||
|
{
|
||||||
|
this.addFile(audioFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new HTML5AudioFile(key, url, loader.path, config);
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
// this.load.audio('sound', 'assets/audio/booom.ogg', config, xhrSettings);
|
// this.load.audio('sound', 'assets/audio/booom.ogg', config, xhrSettings);
|
||||||
//
|
//
|
||||||
|
@ -129,6 +150,7 @@ AudioFile.create = function (loader, key, urls, config, xhrSettings)
|
||||||
// }
|
// }
|
||||||
// ],
|
// ],
|
||||||
// config, xhrSettings);
|
// config, xhrSettings);
|
||||||
|
|
||||||
AudioFile.findAudioURL = function (game, urls)
|
AudioFile.findAudioURL = function (game, urls)
|
||||||
{
|
{
|
||||||
if (urls.constructor !== Array)
|
if (urls.constructor !== Array)
|
||||||
|
|
44
src/loader/filetypes/AudioSprite.js
Normal file
44
src/loader/filetypes/AudioSprite.js
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
var AudioFile = require('./AudioFile.js');
|
||||||
|
var CONST = require('../const');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
|
var JSONFile = require('./JSONFile.js');
|
||||||
|
|
||||||
|
// Phaser.Loader.FileTypes.AudioSprite
|
||||||
|
|
||||||
|
FileTypesManager.register('audioSprite', function (key, urls, json, config, audioXhrSettings, jsonXhrSettings)
|
||||||
|
{
|
||||||
|
var audioFile = AudioFile.create(this, key, urls, config, audioXhrSettings);
|
||||||
|
|
||||||
|
if (audioFile)
|
||||||
|
{
|
||||||
|
var jsonFile;
|
||||||
|
|
||||||
|
if (typeof json === 'string')
|
||||||
|
{
|
||||||
|
jsonFile = new JSONFile(key, json, this.path, jsonXhrSettings);
|
||||||
|
|
||||||
|
this.addFile(jsonFile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
jsonFile = {
|
||||||
|
type: 'json',
|
||||||
|
key: key,
|
||||||
|
data: json,
|
||||||
|
state: CONST.FILE_WAITING_LINKFILE
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link them together
|
||||||
|
audioFile.linkFile = jsonFile;
|
||||||
|
jsonFile.linkFile = audioFile;
|
||||||
|
|
||||||
|
// Set the type
|
||||||
|
audioFile.linkType = 'audioSprite';
|
||||||
|
jsonFile.linkType = 'audioSprite';
|
||||||
|
|
||||||
|
this.addFile(audioFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
});
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.BinaryFile
|
// Phaser.Loader.FileTypes.BinaryFile
|
||||||
|
@ -41,23 +42,29 @@ var BinaryFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
BinaryFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('binary', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new BinaryFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new BinaryFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new BinaryFile(key, url, loader.path, xhrSettings));
|
this.addFile(new BinaryFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = BinaryFile;
|
module.exports = BinaryFile;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var ImageFile = require('./ImageFile.js');
|
var ImageFile = require('./ImageFile.js');
|
||||||
var XMLFile = require('./XMLFile.js');
|
var XMLFile = require('./XMLFile.js');
|
||||||
|
|
||||||
|
@ -17,4 +18,21 @@ var BitmapFontFile = function (key, textureURL, xmlURL, path, textureXhrSettings
|
||||||
return { texture: image, data: data };
|
return { texture: image, data: data };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('bitmapFont', function (key, textureURL, xmlURL, textureXhrSettings, xmlXhrSettings)
|
||||||
|
{
|
||||||
|
// Returns an object with two properties: 'texture' and 'data'
|
||||||
|
var files = new BitmapFontFile(key, textureURL, xmlURL, this.path, textureXhrSettings, xmlXhrSettings);
|
||||||
|
|
||||||
|
this.addFile(files.texture);
|
||||||
|
this.addFile(files.data);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = BitmapFontFile;
|
module.exports = BitmapFontFile;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.GLSLFile
|
// Phaser.Loader.FileTypes.GLSLFile
|
||||||
|
@ -41,23 +42,29 @@ var GLSLFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
GLSLFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('glsl', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new GLSLFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new GLSLFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new GLSLFile(key, url, loader.path, xhrSettings));
|
this.addFile(new GLSLFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = GLSLFile;
|
module.exports = GLSLFile;
|
||||||
|
|
|
@ -11,8 +11,10 @@ var HTML5AudioFile = new Class({
|
||||||
|
|
||||||
initialize:
|
initialize:
|
||||||
|
|
||||||
function HTML5AudioFile (key, url, path, config)
|
function HTML5AudioFile (key, url, path, config, locked)
|
||||||
{
|
{
|
||||||
|
this.locked = locked;
|
||||||
|
|
||||||
var fileConfig = {
|
var fileConfig = {
|
||||||
type: 'audio',
|
type: 'audio',
|
||||||
extension: GetFastValue(url, 'type', ''),
|
extension: GetFastValue(url, 'type', ''),
|
||||||
|
@ -72,14 +74,15 @@ var HTML5AudioFile = new Class({
|
||||||
for(var i = 0; i < instances; i++)
|
for(var i = 0; i < instances; i++)
|
||||||
{
|
{
|
||||||
var audio = new Audio();
|
var audio = new Audio();
|
||||||
audio.name = this.key + ('0' + i).slice(-2); // Useful for debugging
|
audio.dataset.name = this.key + ('0' + i).slice(-2); // Useful for debugging
|
||||||
audio.dataset.used = 'false';
|
audio.dataset.used = 'false';
|
||||||
audio.preload = 'auto';
|
|
||||||
|
|
||||||
// TODO check if ios is locked
|
if (!this.locked)
|
||||||
|
{
|
||||||
audio.oncanplaythrough = this.onProgress.bind(this);
|
audio.preload = 'auto';
|
||||||
audio.onerror = this.onError.bind(this);
|
audio.oncanplaythrough = this.onProgress.bind(this);
|
||||||
|
audio.onerror = this.onError.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
this.data.push(audio);
|
this.data.push(audio);
|
||||||
}
|
}
|
||||||
|
@ -88,7 +91,22 @@ var HTML5AudioFile = new Class({
|
||||||
{
|
{
|
||||||
audio = this.data[i];
|
audio = this.data[i];
|
||||||
audio.src = GetURL(this, baseURL || '');
|
audio.src = GetURL(this, baseURL || '');
|
||||||
audio.load();
|
|
||||||
|
if (!this.locked)
|
||||||
|
{
|
||||||
|
audio.load();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.locked)
|
||||||
|
{
|
||||||
|
setTimeout(function ()
|
||||||
|
{
|
||||||
|
this.filesLoaded = this.filesTotal;
|
||||||
|
this.percentComplete = 1;
|
||||||
|
this.onLoad();
|
||||||
|
|
||||||
|
}.bind(this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.HTMLFile
|
// Phaser.Loader.FileTypes.HTMLFile
|
||||||
|
@ -95,23 +96,29 @@ var HTMLFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
HTMLFile.create = function (loader, key, url, width, height, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('html', function (key, url, width, height, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new HTMLFile(key[i], url, width, height, loader.path, xhrSettings));
|
this.addFile(new HTMLFile(key[i], url, width, height, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new HTMLFile(key, url, width, height, loader.path, xhrSettings));
|
this.addFile(new HTMLFile(key, url, width, height, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = HTMLFile;
|
module.exports = HTMLFile;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.ImageFile
|
// Phaser.Loader.FileTypes.ImageFile
|
||||||
|
@ -26,6 +27,7 @@ var ImageFile = new Class({
|
||||||
// });
|
// });
|
||||||
// this.load.image({ key: 'bunny' });
|
// this.load.image({ key: 'bunny' });
|
||||||
// this.load.image({ key: 'bunny', extension: 'jpg' });
|
// this.load.image({ key: 'bunny', extension: 'jpg' });
|
||||||
|
|
||||||
function ImageFile (key, url, path, xhrSettings, config)
|
function ImageFile (key, url, path, xhrSettings, config)
|
||||||
{
|
{
|
||||||
var fileKey = (typeof key === 'string') ? key : GetFastValue(key, 'key', '');
|
var fileKey = (typeof key === 'string') ? key : GetFastValue(key, 'key', '');
|
||||||
|
@ -73,28 +75,33 @@ var ImageFile = new Class({
|
||||||
};
|
};
|
||||||
|
|
||||||
File.createObjectURL(this.data, this.xhrLoader.response, 'image/png');
|
File.createObjectURL(this.data, this.xhrLoader.response, 'image/png');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ImageFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('image', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new ImageFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new ImageFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new ImageFile(key, url, loader.path, xhrSettings));
|
this.addFile(new ImageFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = ImageFile;
|
module.exports = ImageFile;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.JSONFile
|
// Phaser.Loader.FileTypes.JSONFile
|
||||||
|
@ -11,6 +12,8 @@ var JSONFile = new Class({
|
||||||
|
|
||||||
initialize:
|
initialize:
|
||||||
|
|
||||||
|
// url can either be a string, in which case it is treated like a proper url, or an object, in which case it is treated as a ready-made JS Object
|
||||||
|
|
||||||
function JSONFile (key, url, path, xhrSettings)
|
function JSONFile (key, url, path, xhrSettings)
|
||||||
{
|
{
|
||||||
var fileKey = (typeof key === 'string') ? key : GetFastValue(key, 'key', '');
|
var fileKey = (typeof key === 'string') ? key : GetFastValue(key, 'key', '');
|
||||||
|
@ -26,6 +29,14 @@ var JSONFile = new Class({
|
||||||
};
|
};
|
||||||
|
|
||||||
File.call(this, fileConfig);
|
File.call(this, fileConfig);
|
||||||
|
|
||||||
|
if (typeof fileConfig.url === 'object')
|
||||||
|
{
|
||||||
|
// Object provided instead of a URL, so no need to actually load it (populate data with value)
|
||||||
|
this.data = fileConfig.url;
|
||||||
|
|
||||||
|
this.state = CONST.FILE_POPULATED;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onProcess: function (callback)
|
onProcess: function (callback)
|
||||||
|
@ -41,23 +52,29 @@ var JSONFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
JSONFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('json', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new JSONFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new JSONFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new JSONFile(key, url, loader.path, xhrSettings));
|
this.addFile(new JSONFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = JSONFile;
|
module.exports = JSONFile;
|
||||||
|
|
60
src/loader/filetypes/MultiAtlas.js
Normal file
60
src/loader/filetypes/MultiAtlas.js
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
|
var ImageFile = require('./ImageFile.js');
|
||||||
|
var JSONFile = require('./JSONFile.js');
|
||||||
|
var NumberArray = require('../../utils/array/NumberArray');
|
||||||
|
|
||||||
|
// Phaser.Loader.FileTypes.MultiAtlas
|
||||||
|
|
||||||
|
FileTypesManager.register('multiatlas', function (key, textureURLs, atlasURLs, textureXhrSettings, atlasXhrSettings)
|
||||||
|
{
|
||||||
|
if (typeof textureURLs === 'number')
|
||||||
|
{
|
||||||
|
var total = textureURLs;
|
||||||
|
var suffix = (atlasURLs === undefined) ? '' : atlasURLs;
|
||||||
|
|
||||||
|
textureURLs = NumberArray(0, total, key + suffix, '.png');
|
||||||
|
atlasURLs = NumberArray(0, total, key + suffix, '.json');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!Array.isArray(textureURLs))
|
||||||
|
{
|
||||||
|
textureURLs = [ textureURLs ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Array.isArray(atlasURLs))
|
||||||
|
{
|
||||||
|
atlasURLs = [ atlasURLs ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var file;
|
||||||
|
var i = 0;
|
||||||
|
var multiKey;
|
||||||
|
|
||||||
|
this._multilist[key] = [];
|
||||||
|
|
||||||
|
for (i = 0; i < textureURLs.length; i++)
|
||||||
|
{
|
||||||
|
multiKey = '_MA_IMG_' + key + '_' + i.toString();
|
||||||
|
|
||||||
|
file = new ImageFile(multiKey, textureURLs[i], this.path, textureXhrSettings);
|
||||||
|
|
||||||
|
this.addFile(file);
|
||||||
|
|
||||||
|
this._multilist[key].push(multiKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < atlasURLs.length; i++)
|
||||||
|
{
|
||||||
|
multiKey = '_MA_JSON_' + key + '_' + i.toString();
|
||||||
|
|
||||||
|
file = new JSONFile(multiKey, atlasURLs[i], this.path, atlasXhrSettings);
|
||||||
|
|
||||||
|
this.addFile(file);
|
||||||
|
|
||||||
|
this._multilist[key].push(multiKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
});
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
var PluginManager = require('../../plugins/PluginManager');
|
var PluginManager = require('../../plugins/PluginManager');
|
||||||
|
|
||||||
|
@ -51,23 +52,29 @@ var PluginFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
PluginFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('plugin', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new PluginFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new PluginFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new PluginFile(key, url, loader.path, xhrSettings));
|
this.addFile(new PluginFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = PluginFile;
|
module.exports = PluginFile;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.SVGFile
|
// Phaser.Loader.FileTypes.SVGFile
|
||||||
|
@ -90,23 +91,29 @@ var SVGFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
SVGFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('svg', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new SVGFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new SVGFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new SVGFile(key, url, loader.path, xhrSettings));
|
this.addFile(new SVGFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = SVGFile;
|
module.exports = SVGFile;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.ScriptFile
|
// Phaser.Loader.FileTypes.ScriptFile
|
||||||
|
@ -47,23 +48,29 @@ var ScriptFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ScriptFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('script', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new ScriptFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new ScriptFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new ScriptFile(key, url, loader.path, xhrSettings));
|
this.addFile(new ScriptFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = ScriptFile;
|
module.exports = ScriptFile;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var ImageFile = require('./ImageFile.js');
|
var ImageFile = require('./ImageFile.js');
|
||||||
|
|
||||||
// config can include: frameWidth, frameHeight, startFrame, endFrame, margin, spacing
|
// config can include: frameWidth, frameHeight, startFrame, endFrame, margin, spacing
|
||||||
|
@ -12,23 +13,30 @@ var SpriteSheet = function (key, url, config, path, xhrSettings)
|
||||||
return image;
|
return image;
|
||||||
};
|
};
|
||||||
|
|
||||||
SpriteSheet.create = function (loader, key, url, config, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
// config can include: frameWidth, frameHeight, startFrame, endFrame, margin, spacing
|
||||||
|
FileTypesManager.register('spritesheet', function (key, url, config, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new SpriteSheet(key[i], url, null, loader.path, xhrSettings));
|
this.addFile(new SpriteSheet(key[i], url, null, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new SpriteSheet(key, url, config, loader.path, xhrSettings));
|
this.addFile(new SpriteSheet(key, url, config, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = SpriteSheet;
|
module.exports = SpriteSheet;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.TextFile
|
// Phaser.Loader.FileTypes.TextFile
|
||||||
|
|
||||||
|
@ -38,23 +39,29 @@ var TextFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
TextFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('text', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new TextFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new TextFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new TextFile(key, url, loader.path, xhrSettings));
|
this.addFile(new TextFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = TextFile;
|
module.exports = TextFile;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
|
var TILEMAP_FORMATS = require('../../gameobjects/tilemap/Formats');
|
||||||
|
|
||||||
// Phaser.Loader.FileTypes.TilemapCSVFile
|
// Phaser.Loader.FileTypes.TilemapCSVFile
|
||||||
|
|
||||||
|
@ -10,7 +12,7 @@ var TilemapCSVFile = new Class({
|
||||||
|
|
||||||
initialize:
|
initialize:
|
||||||
|
|
||||||
function TextFile (key, url, path, format, xhrSettings)
|
function TilemapCSVFile (key, url, path, format, xhrSettings)
|
||||||
{
|
{
|
||||||
var fileConfig = {
|
var fileConfig = {
|
||||||
type: 'tilemapCSV',
|
type: 'tilemapCSV',
|
||||||
|
@ -40,23 +42,29 @@ var TilemapCSVFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
TilemapCSVFile.create = function (loader, key, url, format, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('tilemapCSV', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new TilemapCSVFile(key[i], url, loader.path, format, xhrSettings));
|
this.addFile(new TilemapCSVFile(key[i], url, this.path, TILEMAP_FORMATS.CSV, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new TilemapCSVFile(key, url, loader.path, format, xhrSettings));
|
this.addFile(new TilemapCSVFile(key, url, this.path, TILEMAP_FORMATS.CSV, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = TilemapCSVFile;
|
module.exports = TilemapCSVFile;
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var JSONFile = require('./JSONFile.js');
|
var JSONFile = require('./JSONFile.js');
|
||||||
|
var TILEMAP_FORMATS = require('../../gameobjects/tilemap/Formats');
|
||||||
|
|
||||||
|
// Phaser.Loader.FileTypes.TilemapJSONFile
|
||||||
|
|
||||||
var TilemapJSONFile = function (key, url, path, format, xhrSettings)
|
var TilemapJSONFile = function (key, url, path, format, xhrSettings)
|
||||||
{
|
{
|
||||||
|
@ -12,23 +16,48 @@ var TilemapJSONFile = function (key, url, path, format, xhrSettings)
|
||||||
return json;
|
return json;
|
||||||
};
|
};
|
||||||
|
|
||||||
TilemapJSONFile.create = function (loader, key, url, format, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('tilemapTiledJSON', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(TilemapJSONFile(key[i], url, loader.path, format, xhrSettings));
|
this.addFile(TilemapJSONFile(key[i], url, this.path, TILEMAP_FORMATS.TILED_JSON, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(TilemapJSONFile(key, url, loader.path, format, xhrSettings));
|
this.addFile(TilemapJSONFile(key, url, this.path, TILEMAP_FORMATS.TILED_JSON, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
|
FileTypesManager.register('tilemapWeltmeister', function (key, url, xhrSettings)
|
||||||
|
{
|
||||||
|
if (Array.isArray(key))
|
||||||
|
{
|
||||||
|
for (var i = 0; i < key.length; i++)
|
||||||
|
{
|
||||||
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
|
this.addFile(TilemapJSONFile(key[i], url, this.path, TILEMAP_FORMATS.WELTMEISTER.TILED_JSON, xhrSettings));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.addFile(TilemapJSONFile(key, url, this.path, TILEMAP_FORMATS.WELTMEISTER.TILED_JSON, xhrSettings));
|
||||||
|
}
|
||||||
|
|
||||||
|
// For method chaining
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = TilemapJSONFile;
|
module.exports = TilemapJSONFile;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var ImageFile = require('./ImageFile.js');
|
var ImageFile = require('./ImageFile.js');
|
||||||
var TextFile = require('./TextFile.js');
|
var TextFile = require('./TextFile.js');
|
||||||
|
|
||||||
|
@ -17,4 +18,22 @@ var UnityAtlasFile = function (key, textureURL, atlasURL, path, textureXhrSettin
|
||||||
return { texture: image, data: data };
|
return { texture: image, data: data };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('unityAtlas', function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
|
||||||
|
{
|
||||||
|
// Returns an object with two properties: 'texture' and 'data'
|
||||||
|
var files = new UnityAtlasFile(key, textureURL, atlasURL, this.path, textureXhrSettings, atlasXhrSettings);
|
||||||
|
|
||||||
|
this.addFile(files.texture);
|
||||||
|
this.addFile(files.data);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = UnityAtlasFile;
|
module.exports = UnityAtlasFile;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
var ParseOBJ = require('../../geom/mesh/ParseOBJ');
|
var ParseOBJ = require('../../geom/mesh/ParseOBJ');
|
||||||
|
|
||||||
|
@ -42,23 +43,29 @@ var WavefrontFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
WavefrontFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('obj', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new WavefrontFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new WavefrontFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new WavefrontFile(key, url, loader.path, xhrSettings));
|
this.addFile(new WavefrontFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = WavefrontFile;
|
module.exports = WavefrontFile;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
var CONST = require('../const');
|
var CONST = require('../const');
|
||||||
var File = require('../File');
|
var File = require('../File');
|
||||||
|
var FileTypesManager = require('../FileTypesManager');
|
||||||
var GetFastValue = require('../../utils/object/GetFastValue');
|
var GetFastValue = require('../../utils/object/GetFastValue');
|
||||||
var ParseXML = require('../../dom/ParseXML');
|
var ParseXML = require('../../dom/ParseXML');
|
||||||
|
|
||||||
|
@ -47,23 +48,29 @@ var XMLFile = new Class({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
XMLFile.create = function (loader, key, url, xhrSettings)
|
// When registering a factory function 'this' refers to the Loader context.
|
||||||
|
//
|
||||||
|
// There are several properties available to use:
|
||||||
|
//
|
||||||
|
// this.scene - a reference to the Scene that owns the GameObjectFactory
|
||||||
|
|
||||||
|
FileTypesManager.register('xml', function (key, url, xhrSettings)
|
||||||
{
|
{
|
||||||
if (Array.isArray(key))
|
if (Array.isArray(key))
|
||||||
{
|
{
|
||||||
for (var i = 0; i < key.length; i++)
|
for (var i = 0; i < key.length; i++)
|
||||||
{
|
{
|
||||||
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
// If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
|
||||||
loader.addFile(new XMLFile(key[i], url, loader.path, xhrSettings));
|
this.addFile(new XMLFile(key[i], url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loader.addFile(new XMLFile(key, url, loader.path, xhrSettings));
|
this.addFile(new XMLFile(key, url, this.path, xhrSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For method chaining
|
// For method chaining
|
||||||
return loader;
|
return this;
|
||||||
};
|
});
|
||||||
|
|
||||||
module.exports = XMLFile;
|
module.exports = XMLFile;
|
||||||
|
|
|
@ -2,8 +2,32 @@
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
||||||
BaseLoader: require('./BaseLoader'),
|
LoaderPlugin: require('./LoaderPlugin'),
|
||||||
File: require('./File'),
|
File: require('./File'),
|
||||||
LoaderPlugin: require('./Loader')
|
FileTypesManager: require('./FileTypesManager'),
|
||||||
|
|
||||||
|
FileTypes: {
|
||||||
|
AnimationJSONFile: require('./filetypes/AnimationJSONFile'),
|
||||||
|
AtlasJSONFile: require('./filetypes/AtlasJSONFile'),
|
||||||
|
AudioFile: require('./filetypes/AudioFile'),
|
||||||
|
AudioSprite: require('./filetypes/AudioSprite'),
|
||||||
|
BinaryFile: require('./filetypes/BinaryFile'),
|
||||||
|
BitmapFontFile: require('./filetypes/BitmapFontFile'),
|
||||||
|
GLSLFile: require('./filetypes/GLSLFile'),
|
||||||
|
HTMLFile: require('./filetypes/HTMLFile'),
|
||||||
|
ImageFile: require('./filetypes/ImageFile'),
|
||||||
|
JSONFile: require('./filetypes/JSONFile'),
|
||||||
|
MultiAtlas: require('./filetypes/MultiAtlas'),
|
||||||
|
PluginFile: require('./filetypes/PluginFile'),
|
||||||
|
ScriptFile: require('./filetypes/ScriptFile'),
|
||||||
|
SpriteSheet: require('./filetypes/SpriteSheet'),
|
||||||
|
SVGFile: require('./filetypes/SVGFile'),
|
||||||
|
TextFile: require('./filetypes/TextFile'),
|
||||||
|
TilemapCSVFile: require('./filetypes/TilemapCSVFile'),
|
||||||
|
TilemapJSONFile: require('./filetypes/TilemapJSONFile'),
|
||||||
|
UnityAtlasFile: require('./filetypes/UnityAtlasFile'),
|
||||||
|
WavefrontFile: require('./filetypes/WavefrontFile'),
|
||||||
|
XMLFile: require('./filetypes/XMLFile')
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,14 +23,14 @@ var CollideSpriteVsTilemapLayer = function (sprite, tilemapLayer, collideCallbac
|
||||||
if (layerData.tileWidth > layerData.baseTileWidth)
|
if (layerData.tileWidth > layerData.baseTileWidth)
|
||||||
{
|
{
|
||||||
// The x origin of a tile is the left side, so x and width need to be adjusted.
|
// The x origin of a tile is the left side, so x and width need to be adjusted.
|
||||||
let xDiff = (layerData.tileWidth - layerData.baseTileWidth) * tilemapLayer.scaleX;
|
var xDiff = (layerData.tileWidth - layerData.baseTileWidth) * tilemapLayer.scaleX;
|
||||||
x -= xDiff;
|
x -= xDiff;
|
||||||
w += xDiff;
|
w += xDiff;
|
||||||
}
|
}
|
||||||
if (layerData.tileHeight > layerData.baseTileHeight)
|
if (layerData.tileHeight > layerData.baseTileHeight)
|
||||||
{
|
{
|
||||||
// The y origin of a tile is the bottom side, so just the height needs to be adjusted.
|
// The y origin of a tile is the bottom side, so just the height needs to be adjusted.
|
||||||
let yDiff = (layerData.tileHeight - layerData.baseTileHeight) * tilemapLayer.scaleY;
|
var yDiff = (layerData.tileHeight - layerData.baseTileHeight) * tilemapLayer.scaleY;
|
||||||
h += yDiff;
|
h += yDiff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
var Class = require('../utils/Class');
|
|
||||||
var PluginManager = require('../plugins/PluginManager');
|
|
||||||
|
|
||||||
var TestPlugin = new Class({
|
|
||||||
|
|
||||||
initialize:
|
|
||||||
|
|
||||||
function TestPlugin (scene)
|
|
||||||
{
|
|
||||||
this.scene = scene;
|
|
||||||
|
|
||||||
this.systems = scene.sys;
|
|
||||||
|
|
||||||
this.mapping = 'test';
|
|
||||||
|
|
||||||
console.log('TestPlugin is alive');
|
|
||||||
|
|
||||||
if (!scene.sys.settings.isBooted)
|
|
||||||
{
|
|
||||||
scene.sys.events.once('boot', this.boot, this);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
boot: function ()
|
|
||||||
{
|
|
||||||
console.log('TestPlugin has booted');
|
|
||||||
|
|
||||||
this.scene[this.mapping] = this;
|
|
||||||
},
|
|
||||||
|
|
||||||
fire: function (img)
|
|
||||||
{
|
|
||||||
console.log('Hello!');
|
|
||||||
|
|
||||||
this.systems.add.image(400, 300, img);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
PluginManager.register('test', TestPlugin);
|
|
||||||
|
|
||||||
module.exports = TestPlugin;
|
|
|
@ -105,6 +105,14 @@ var SceneManager = new Class({
|
||||||
scene.init.call(scene, scene.sys.settings.data);
|
scene.init.call(scene, scene.sys.settings.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Insert at the correct index, or it just all goes wrong :)
|
||||||
|
var i = this.getSceneIndex(scene);
|
||||||
|
|
||||||
|
this.active.push({ index: i, scene: scene });
|
||||||
|
|
||||||
|
// Sort the 'active' array based on the index property
|
||||||
|
this.active.sort(this.sortScenes);
|
||||||
|
|
||||||
var loader;
|
var loader;
|
||||||
|
|
||||||
if (scene.sys.load)
|
if (scene.sys.load)
|
||||||
|
@ -126,7 +134,6 @@ var SceneManager = new Class({
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Start the loader going as we have something in the queue
|
// Start the loader going as we have something in the queue
|
||||||
|
|
||||||
loader.once('complete', this.loadComplete, this);
|
loader.once('complete', this.loadComplete, this);
|
||||||
|
|
||||||
loader.start();
|
loader.start();
|
||||||
|
@ -260,15 +267,6 @@ var SceneManager = new Class({
|
||||||
*/
|
*/
|
||||||
create: function (scene)
|
create: function (scene)
|
||||||
{
|
{
|
||||||
// Insert at the correct index, or it just all goes wrong :)
|
|
||||||
|
|
||||||
var i = this.getSceneIndex(scene);
|
|
||||||
|
|
||||||
this.active.push({ index: i, scene: scene });
|
|
||||||
|
|
||||||
// Sort the 'active' array based on the index property
|
|
||||||
this.active.sort(this.sortScenes);
|
|
||||||
|
|
||||||
if (scene.create)
|
if (scene.create)
|
||||||
{
|
{
|
||||||
scene.create.call(scene, scene.sys.settings.data);
|
scene.create.call(scene, scene.sys.settings.data);
|
||||||
|
@ -354,42 +352,11 @@ var SceneManager = new Class({
|
||||||
|
|
||||||
this.createSceneDisplay(newScene);
|
this.createSceneDisplay(newScene);
|
||||||
|
|
||||||
// Default required functions
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (!newScene.init)
|
|
||||||
{
|
|
||||||
newScene.init = NOOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!newScene.preload)
|
|
||||||
{
|
|
||||||
newScene.preload = NOOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!newScene.create)
|
|
||||||
{
|
|
||||||
newScene.create = NOOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!newScene.shutdown)
|
|
||||||
{
|
|
||||||
newScene.shutdown = NOOP;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!newScene.update)
|
if (!newScene.update)
|
||||||
{
|
{
|
||||||
newScene.update = NOOP;
|
newScene.update = NOOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if (!newScene.render)
|
|
||||||
{
|
|
||||||
newScene.render = NOOP;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return newScene;
|
return newScene;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -455,21 +422,27 @@ var SceneManager = new Class({
|
||||||
|
|
||||||
this.createSceneDisplay(newScene);
|
this.createSceneDisplay(newScene);
|
||||||
|
|
||||||
// Extract callbacks or set NOOP
|
// Extract callbacks
|
||||||
|
|
||||||
var defaults = [ 'init', 'preload', 'create', 'update', 'render' ];
|
var defaults = [ 'init', 'preload', 'create', 'update', 'render', 'shutdown', 'destroy' ];
|
||||||
|
|
||||||
for (var i = 0; i < defaults.length; i++)
|
for (var i = 0; i < defaults.length; i++)
|
||||||
{
|
{
|
||||||
var sceneCallback = GetValue(sceneConfig, defaults[i], null);
|
var sceneCallback = GetValue(sceneConfig, defaults[i], null);
|
||||||
|
|
||||||
|
// Must always have an update function, no matter what (the rest are optional)
|
||||||
|
if (defaults[i] === 'update' && !sceneCallback)
|
||||||
|
{
|
||||||
|
sceneCallback = NOOP;
|
||||||
|
}
|
||||||
|
|
||||||
if (sceneCallback)
|
if (sceneCallback)
|
||||||
{
|
{
|
||||||
newScene[defaults[i]] = sceneCallback;
|
newScene[defaults[i]] = sceneCallback;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now let's move across any other functions or properties that may exist
|
// Now let's move across any other functions or properties that may exist in the extend object:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
scene: {
|
scene: {
|
||||||
|
@ -487,10 +460,7 @@ var SceneManager = new Class({
|
||||||
{
|
{
|
||||||
for (var propertyKey in sceneConfig.extend)
|
for (var propertyKey in sceneConfig.extend)
|
||||||
{
|
{
|
||||||
if (defaults.indexOf(propertyKey) === -1)
|
newScene[propertyKey] = sceneConfig.extend[propertyKey];
|
||||||
{
|
|
||||||
newScene[propertyKey] = sceneConfig.extend[propertyKey];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -807,11 +777,9 @@ var SceneManager = new Class({
|
||||||
*
|
*
|
||||||
* @param {object} event - [description]
|
* @param {object} event - [description]
|
||||||
*/
|
*/
|
||||||
payloadComplete: function (event)
|
payloadComplete: function (loader)
|
||||||
{
|
{
|
||||||
var scene = event.loader.scene;
|
this.bootScene(loader.scene);
|
||||||
|
|
||||||
this.bootScene(scene);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,6 +47,10 @@ var Settings = {
|
||||||
|
|
||||||
physics: GetValue(config, 'physics', {}),
|
physics: GetValue(config, 'physics', {}),
|
||||||
|
|
||||||
|
// Loader
|
||||||
|
|
||||||
|
loader: GetValue(config, 'loader', {}),
|
||||||
|
|
||||||
// Plugins
|
// Plugins
|
||||||
|
|
||||||
plugins: GetValue(config, 'plugins', false),
|
plugins: GetValue(config, 'plugins', false),
|
||||||
|
|
|
@ -98,6 +98,27 @@ var BaseSoundManager = new Class({
|
||||||
* @default 0
|
* @default 0
|
||||||
*/
|
*/
|
||||||
this._detune = 0;
|
this._detune = 0;
|
||||||
|
/**
|
||||||
|
* Mobile devices require sounds to be triggered from an explicit user action,
|
||||||
|
* such as a tap, before any sound can be loaded/played on a web page.
|
||||||
|
* Set to true if the audio system is currently locked awaiting user interaction.
|
||||||
|
*
|
||||||
|
* @readonly
|
||||||
|
* @property {boolean} locked
|
||||||
|
*/
|
||||||
|
this.locked = this.locked || false;
|
||||||
|
/**
|
||||||
|
* Flag used internally for handling when the audio system
|
||||||
|
* has been unlocked, if there ever was a need for it.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @property {boolean} unlocked
|
||||||
|
* @default false
|
||||||
|
*/
|
||||||
|
this.unlocked = false;
|
||||||
|
if (this.locked) {
|
||||||
|
this.unlock();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* Adds a new sound into the sound manager.
|
* Adds a new sound into the sound manager.
|
||||||
|
@ -248,6 +269,17 @@ var BaseSoundManager = new Class({
|
||||||
});
|
});
|
||||||
this.emit('stopall', this);
|
this.emit('stopall', this);
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* Method used internally for unlocking audio playback on devices that
|
||||||
|
* require user interaction before any sound can be played on a web page.
|
||||||
|
*
|
||||||
|
* Read more about how this issue is handled here in [this article](TODO add link).
|
||||||
|
*
|
||||||
|
* @override
|
||||||
|
* @protected
|
||||||
|
* @method Phaser.Sound.BaseSoundManager#unlock
|
||||||
|
*/
|
||||||
|
unlock: NOOP,
|
||||||
/**
|
/**
|
||||||
* Method used internally for pausing sound manager if
|
* Method used internally for pausing sound manager if
|
||||||
* Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true.
|
* Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true.
|
||||||
|
@ -276,6 +308,11 @@ var BaseSoundManager = new Class({
|
||||||
* @param {number} delta - The delta time elapsed since the last frame.
|
* @param {number} delta - The delta time elapsed since the last frame.
|
||||||
*/
|
*/
|
||||||
update: function (time, delta) {
|
update: function (time, delta) {
|
||||||
|
if (this.unlocked) {
|
||||||
|
this.unlocked = false;
|
||||||
|
this.locked = false;
|
||||||
|
this.emit('unlocked', this);
|
||||||
|
}
|
||||||
for (var i = this.sounds.length - 1; i >= 0; i--) {
|
for (var i = this.sounds.length - 1; i >= 0; i--) {
|
||||||
if (this.sounds[i].pendingRemove) {
|
if (this.sounds[i].pendingRemove) {
|
||||||
this.sounds.splice(i, 1);
|
this.sounds.splice(i, 1);
|
||||||
|
|
|
@ -49,6 +49,9 @@ var HTML5AudioSound = new Class({
|
||||||
BaseSound.call(this, manager, key, config);
|
BaseSound.call(this, manager, key, config);
|
||||||
},
|
},
|
||||||
play: function (markerName, config) {
|
play: function (markerName, config) {
|
||||||
|
if (this.manager.isLocked(this, 'play', [markerName, config])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!BaseSound.prototype.play.call(this, markerName, config)) {
|
if (!BaseSound.prototype.play.call(this, markerName, config)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -60,6 +63,9 @@ var HTML5AudioSound = new Class({
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
pause: function () {
|
pause: function () {
|
||||||
|
if (this.manager.isLocked(this, 'pause')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (this.startTime > 0) {
|
if (this.startTime > 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -74,6 +80,9 @@ var HTML5AudioSound = new Class({
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
resume: function () {
|
resume: function () {
|
||||||
|
if (this.manager.isLocked(this, 'resume')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (this.startTime > 0) {
|
if (this.startTime > 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -88,6 +97,9 @@ var HTML5AudioSound = new Class({
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
stop: function () {
|
stop: function () {
|
||||||
|
if (this.manager.isLocked(this, 'stop')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!BaseSound.prototype.stop.call(this)) {
|
if (!BaseSound.prototype.stop.call(this)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -110,7 +122,7 @@ var HTML5AudioSound = new Class({
|
||||||
if (delay === 0) {
|
if (delay === 0) {
|
||||||
this.startTime = 0;
|
this.startTime = 0;
|
||||||
if (this.audio.paused) {
|
if (this.audio.paused) {
|
||||||
this.audio.play();
|
this.playCatchPromise();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -123,40 +135,47 @@ var HTML5AudioSound = new Class({
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
pickAudioTag: function () {
|
pickAudioTag: function () {
|
||||||
if (!this.audio) {
|
if (this.audio) {
|
||||||
for (var i = 0; i < this.tags.length; i++) {
|
return true;
|
||||||
var audio = this.tags[i];
|
|
||||||
if (audio.dataset.used === 'false') {
|
|
||||||
audio.dataset.used = 'true';
|
|
||||||
this.audio = audio;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!this.manager.override) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var otherSounds_1 = [];
|
|
||||||
this.manager.forEachActiveSound(function (sound) {
|
|
||||||
if (sound.key === this.key && sound.audio) {
|
|
||||||
otherSounds_1.push(sound);
|
|
||||||
}
|
|
||||||
}, this);
|
|
||||||
otherSounds_1.sort(function (a1, a2) {
|
|
||||||
if (a1.loop === a2.loop) {
|
|
||||||
// sort by progress
|
|
||||||
return (a2.seek / a2.duration) - (a1.seek / a1.duration);
|
|
||||||
}
|
|
||||||
return a1.loop ? 1 : -1;
|
|
||||||
});
|
|
||||||
var selectedSound = otherSounds_1[0];
|
|
||||||
this.audio = selectedSound.audio;
|
|
||||||
selectedSound.reset();
|
|
||||||
selectedSound.audio = null;
|
|
||||||
selectedSound.startTime = 0;
|
|
||||||
selectedSound.previousTime = 0;
|
|
||||||
}
|
}
|
||||||
|
for (var i = 0; i < this.tags.length; i++) {
|
||||||
|
var audio = this.tags[i];
|
||||||
|
if (audio.dataset.used === 'false') {
|
||||||
|
audio.dataset.used = 'true';
|
||||||
|
this.audio = audio;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!this.manager.override) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var otherSounds = [];
|
||||||
|
this.manager.forEachActiveSound(function (sound) {
|
||||||
|
if (sound.key === this.key && sound.audio) {
|
||||||
|
otherSounds.push(sound);
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
otherSounds.sort(function (a1, a2) {
|
||||||
|
if (a1.loop === a2.loop) {
|
||||||
|
// sort by progress
|
||||||
|
return (a2.seek / a2.duration) - (a1.seek / a1.duration);
|
||||||
|
}
|
||||||
|
return a1.loop ? 1 : -1;
|
||||||
|
});
|
||||||
|
var selectedSound = otherSounds[0];
|
||||||
|
this.audio = selectedSound.audio;
|
||||||
|
selectedSound.reset();
|
||||||
|
selectedSound.audio = null;
|
||||||
|
selectedSound.startTime = 0;
|
||||||
|
selectedSound.previousTime = 0;
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
playCatchPromise: function () {
|
||||||
|
var playPromise = this.audio.play();
|
||||||
|
if (playPromise) {
|
||||||
|
playPromise.catch(function (reason) { });
|
||||||
|
}
|
||||||
|
},
|
||||||
stopAndReleaseAudioTag: function () {
|
stopAndReleaseAudioTag: function () {
|
||||||
this.audio.pause();
|
this.audio.pause();
|
||||||
this.audio.dataset.used = 'false';
|
this.audio.dataset.used = 'false';
|
||||||
|
@ -181,42 +200,43 @@ var HTML5AudioSound = new Class({
|
||||||
this.pickAndPlayAudioTag();
|
this.pickAndPlayAudioTag();
|
||||||
},
|
},
|
||||||
update: function (time, delta) {
|
update: function (time, delta) {
|
||||||
if (this.isPlaying) {
|
if (!this.isPlaying) {
|
||||||
// handling delayed playback
|
return;
|
||||||
if (this.startTime > 0) {
|
|
||||||
if (this.startTime < time - this.manager.audioPlayDelay) {
|
|
||||||
this.audio.currentTime += Math.max(0, time - this.startTime) / 1000;
|
|
||||||
this.startTime = 0;
|
|
||||||
this.previousTime = this.audio.currentTime;
|
|
||||||
this.audio.play();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// handle looping and ending
|
|
||||||
var startTime = this.currentMarker ? this.currentMarker.start : 0;
|
|
||||||
var endTime = startTime + this.duration;
|
|
||||||
var currentTime = this.audio.currentTime;
|
|
||||||
if (this.currentConfig.loop) {
|
|
||||||
if (currentTime >= endTime - this.manager.loopEndOffset) {
|
|
||||||
this.audio.currentTime = startTime + Math.max(0, currentTime - endTime);
|
|
||||||
currentTime = this.audio.currentTime;
|
|
||||||
}
|
|
||||||
else if (currentTime < startTime) {
|
|
||||||
this.audio.currentTime += startTime;
|
|
||||||
currentTime = this.audio.currentTime;
|
|
||||||
}
|
|
||||||
if (currentTime < this.previousTime) {
|
|
||||||
this.emit('looped', this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (currentTime >= endTime) {
|
|
||||||
this.reset();
|
|
||||||
this.stopAndReleaseAudioTag();
|
|
||||||
this.emit('ended', this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.previousTime = currentTime;
|
|
||||||
}
|
}
|
||||||
|
// handling delayed playback
|
||||||
|
if (this.startTime > 0) {
|
||||||
|
if (this.startTime < time - this.manager.audioPlayDelay) {
|
||||||
|
this.audio.currentTime += Math.max(0, time - this.startTime) / 1000;
|
||||||
|
this.startTime = 0;
|
||||||
|
this.previousTime = this.audio.currentTime;
|
||||||
|
this.playCatchPromise();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// handle looping and ending
|
||||||
|
var startTime = this.currentMarker ? this.currentMarker.start : 0;
|
||||||
|
var endTime = startTime + this.duration;
|
||||||
|
var currentTime = this.audio.currentTime;
|
||||||
|
if (this.currentConfig.loop) {
|
||||||
|
if (currentTime >= endTime - this.manager.loopEndOffset) {
|
||||||
|
this.audio.currentTime = startTime + Math.max(0, currentTime - endTime);
|
||||||
|
currentTime = this.audio.currentTime;
|
||||||
|
}
|
||||||
|
else if (currentTime < startTime) {
|
||||||
|
this.audio.currentTime += startTime;
|
||||||
|
currentTime = this.audio.currentTime;
|
||||||
|
}
|
||||||
|
if (currentTime < this.previousTime) {
|
||||||
|
this.emit('looped', this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (currentTime >= endTime) {
|
||||||
|
this.reset();
|
||||||
|
this.stopAndReleaseAudioTag();
|
||||||
|
this.emit('ended', this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.previousTime = currentTime;
|
||||||
},
|
},
|
||||||
destroy: function () {
|
destroy: function () {
|
||||||
BaseSound.prototype.destroy.call(this);
|
BaseSound.prototype.destroy.call(this);
|
||||||
|
@ -254,6 +274,9 @@ Object.defineProperty(HTML5AudioSound.prototype, 'mute', {
|
||||||
},
|
},
|
||||||
set: function (value) {
|
set: function (value) {
|
||||||
this.currentConfig.mute = value;
|
this.currentConfig.mute = value;
|
||||||
|
if (this.manager.isLocked(this, 'mute', value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.setMute();
|
this.setMute();
|
||||||
this.emit('mute', this, value);
|
this.emit('mute', this, value);
|
||||||
}
|
}
|
||||||
|
@ -270,10 +293,49 @@ Object.defineProperty(HTML5AudioSound.prototype, 'volume', {
|
||||||
},
|
},
|
||||||
set: function (value) {
|
set: function (value) {
|
||||||
this.currentConfig.volume = value;
|
this.currentConfig.volume = value;
|
||||||
|
if (this.manager.isLocked(this, 'volume', value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.setVolume();
|
this.setVolume();
|
||||||
this.emit('volume', this, value);
|
this.emit('volume', this, value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* Playback rate.
|
||||||
|
*
|
||||||
|
* @name Phaser.Sound.HTML5AudioSound#rate
|
||||||
|
* @property {number} rate
|
||||||
|
*/
|
||||||
|
Object.defineProperty(HTML5AudioSound.prototype, 'rate', {
|
||||||
|
get: function () {
|
||||||
|
return Object.getOwnPropertyDescriptor(BaseSound.prototype, 'rate').get.call(this);
|
||||||
|
},
|
||||||
|
set: function (value) {
|
||||||
|
this.currentConfig.rate = value;
|
||||||
|
if (this.manager.isLocked(this, 'rate', value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Object.getOwnPropertyDescriptor(BaseSound.prototype, 'rate').set.call(this, value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/**
|
||||||
|
* Detuning of sound.
|
||||||
|
*
|
||||||
|
* @name Phaser.Sound.HTML5AudioSound#detune
|
||||||
|
* @property {number} detune
|
||||||
|
*/
|
||||||
|
Object.defineProperty(HTML5AudioSound.prototype, 'detune', {
|
||||||
|
get: function () {
|
||||||
|
return Object.getOwnPropertyDescriptor(BaseSound.prototype, 'detune').get.call(this);
|
||||||
|
},
|
||||||
|
set: function (value) {
|
||||||
|
this.currentConfig.detune = value;
|
||||||
|
if (this.manager.isLocked(this, 'detune', value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Object.getOwnPropertyDescriptor(BaseSound.prototype, 'detune').set.call(this, value);
|
||||||
|
}
|
||||||
|
});
|
||||||
/**
|
/**
|
||||||
* Current position of playing sound.
|
* Current position of playing sound.
|
||||||
*
|
*
|
||||||
|
@ -294,6 +356,9 @@ Object.defineProperty(HTML5AudioSound.prototype, 'seek', {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
set: function (value) {
|
set: function (value) {
|
||||||
|
if (this.manager.isLocked(this, 'seek', value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (this.startTime > 0) {
|
if (this.startTime > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -323,6 +388,9 @@ Object.defineProperty(HTML5AudioSound.prototype, 'loop', {
|
||||||
},
|
},
|
||||||
set: function (value) {
|
set: function (value) {
|
||||||
this.currentConfig.loop = value;
|
this.currentConfig.loop = value;
|
||||||
|
if (this.manager.isLocked(this, 'loop', value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (this.audio) {
|
if (this.audio) {
|
||||||
this.audio.loop = value;
|
this.audio.loop = value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,20 @@ var HTML5AudioSoundManager = new Class({
|
||||||
* @default []
|
* @default []
|
||||||
*/
|
*/
|
||||||
this.onBlurPausedSounds = [];
|
this.onBlurPausedSounds = [];
|
||||||
|
this.locked = 'ontouchstart' in window;
|
||||||
|
/**
|
||||||
|
* A queue of all actions performed on sound objects while audio was locked.
|
||||||
|
* Once the audio gets unlocked, after an explicit user interaction,
|
||||||
|
* all actions will be performed in chronological order.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @property {{
|
||||||
|
* sound: Phaser.Sound.HTML5AudioSound,
|
||||||
|
* name: string,
|
||||||
|
* value?: any,
|
||||||
|
* }[]} lockedActionsQueue
|
||||||
|
*/
|
||||||
|
this.lockedActionsQueue = this.locked ? [] : null;
|
||||||
/**
|
/**
|
||||||
* Property that actually holds the value of global mute
|
* Property that actually holds the value of global mute
|
||||||
* for HTML5 Audio sound manager implementation.
|
* for HTML5 Audio sound manager implementation.
|
||||||
|
@ -71,6 +85,54 @@ var HTML5AudioSoundManager = new Class({
|
||||||
this.sounds.push(sound);
|
this.sounds.push(sound);
|
||||||
return sound;
|
return sound;
|
||||||
},
|
},
|
||||||
|
unlock: function () {
|
||||||
|
var _this = this;
|
||||||
|
var moved = false;
|
||||||
|
var detectMove = function () {
|
||||||
|
moved = true;
|
||||||
|
};
|
||||||
|
var unlock = function () {
|
||||||
|
if (moved) {
|
||||||
|
moved = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
document.body.removeEventListener('touchmove', detectMove);
|
||||||
|
document.body.removeEventListener('touchend', unlock);
|
||||||
|
var allTags = [];
|
||||||
|
_this.game.cache.audio.entries.each(function (key, tags) {
|
||||||
|
for (var i = 0; i < tags.length; i++) {
|
||||||
|
allTags.push(tags[i]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
var lastTag = allTags[allTags.length - 1];
|
||||||
|
lastTag.oncanplaythrough = function () {
|
||||||
|
lastTag.oncanplaythrough = null;
|
||||||
|
_this.unlocked = true;
|
||||||
|
};
|
||||||
|
allTags.forEach(function (tag) {
|
||||||
|
tag.load();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
this.once('unlocked', function () {
|
||||||
|
_this.forEachActiveSound(function (sound) {
|
||||||
|
sound.duration = sound.tags[0].duration;
|
||||||
|
sound.totalDuration = sound.tags[0].duration;
|
||||||
|
});
|
||||||
|
_this.lockedActionsQueue.forEach(function (lockedAction) {
|
||||||
|
if (lockedAction.sound[lockedAction.prop].apply) {
|
||||||
|
lockedAction.sound[lockedAction.prop].apply(lockedAction.sound, lockedAction.value || []);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lockedAction.sound[lockedAction.prop] = lockedAction.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
_this.lockedActionsQueue.length = 0;
|
||||||
|
_this.lockedActionsQueue = null;
|
||||||
|
});
|
||||||
|
document.body.addEventListener('touchmove', detectMove, false);
|
||||||
|
document.body.addEventListener('touchend', unlock, false);
|
||||||
|
},
|
||||||
onBlur: function () {
|
onBlur: function () {
|
||||||
this.forEachActiveSound(function (sound) {
|
this.forEachActiveSound(function (sound) {
|
||||||
if (sound.isPlaying) {
|
if (sound.isPlaying) {
|
||||||
|
@ -89,6 +151,17 @@ var HTML5AudioSoundManager = new Class({
|
||||||
BaseSoundManager.prototype.destroy.call(this);
|
BaseSoundManager.prototype.destroy.call(this);
|
||||||
this.onBlurPausedSounds.length = 0;
|
this.onBlurPausedSounds.length = 0;
|
||||||
this.onBlurPausedSounds = null;
|
this.onBlurPausedSounds = null;
|
||||||
|
},
|
||||||
|
isLocked: function (sound, prop, value) {
|
||||||
|
if (this.locked) {
|
||||||
|
this.lockedActionsQueue.push({
|
||||||
|
sound: sound,
|
||||||
|
prop: prop,
|
||||||
|
value: value
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -44,7 +44,7 @@ var WebAudioSoundManager = new Class({
|
||||||
* @property {AudioNode} destination
|
* @property {AudioNode} destination
|
||||||
*/
|
*/
|
||||||
this.destination = this.masterMuteNode;
|
this.destination = this.masterMuteNode;
|
||||||
this.unlock();
|
this.locked = this.context.state === 'suspended' && 'ontouchstart' in window;
|
||||||
BaseSoundManager.call(this, game);
|
BaseSoundManager.call(this, game);
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
|
@ -81,6 +81,7 @@ var WebAudioSoundManager = new Class({
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* Unlocks Web Audio API on iOS devices on the initial touch event.
|
* Unlocks Web Audio API on iOS devices on the initial touch event.
|
||||||
|
*
|
||||||
* Read more about how this issue is handled here in [this article](TODO add link).
|
* Read more about how this issue is handled here in [this article](TODO add link).
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
|
@ -88,16 +89,15 @@ var WebAudioSoundManager = new Class({
|
||||||
*/
|
*/
|
||||||
unlock: function () {
|
unlock: function () {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
if (this.context.state === 'suspended' && 'ontouchstart' in window) {
|
var unlock = function () {
|
||||||
var unlock_1 = function () {
|
_this.context.resume().then(function () {
|
||||||
_this.context.resume().then(function () {
|
document.body.removeEventListener('touchstart', unlock);
|
||||||
document.body.removeEventListener('touchstart', unlock_1);
|
document.body.removeEventListener('touchend', unlock);
|
||||||
document.body.removeEventListener('touchend', unlock_1);
|
_this.unlocked = true;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
document.body.addEventListener('touchstart', unlock_1, false);
|
document.body.addEventListener('touchstart', unlock, false);
|
||||||
document.body.addEventListener('touchend', unlock_1, false);
|
document.body.addEventListener('touchend', unlock, false);
|
||||||
}
|
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* Method used internally for pausing sound manager if
|
* Method used internally for pausing sound manager if
|
||||||
|
|
|
@ -80,6 +80,16 @@ var Frame = new Class({
|
||||||
*/
|
*/
|
||||||
this.centerY = Math.floor(height / 2);
|
this.centerY = Math.floor(height / 2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @property {number} pivotX - The horizontal pivot point of this Frame.
|
||||||
|
*/
|
||||||
|
this.pivotX = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @property {number} height - The vertical pivot point of this Frame.
|
||||||
|
*/
|
||||||
|
this.pivotY = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is this frame is rotated or not in the Texture?
|
* Is this frame is rotated or not in the Texture?
|
||||||
* Rotation allows you to use rotated frames in texture atlas packing.
|
* Rotation allows you to use rotated frames in texture atlas packing.
|
||||||
|
@ -93,6 +103,9 @@ var Frame = new Class({
|
||||||
// Over-rides the Renderer setting? -1 = use Renderer Setting, 0 = No rounding, 1 = Round
|
// Over-rides the Renderer setting? -1 = use Renderer Setting, 0 = No rounding, 1 = Round
|
||||||
this.autoRound = -1;
|
this.autoRound = -1;
|
||||||
|
|
||||||
|
// Any Frame specific custom data can be stored here
|
||||||
|
this.customData = {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The un-modified source frame, trim and UV data.
|
* The un-modified source frame, trim and UV data.
|
||||||
*
|
*
|
||||||
|
|
|
@ -36,6 +36,9 @@ var Texture = new Class({
|
||||||
|
|
||||||
this.frames = {};
|
this.frames = {};
|
||||||
|
|
||||||
|
// Any additional data that was set in the source JSON (if any), or any extra data you'd like to store relating to this texture
|
||||||
|
this.customData = {};
|
||||||
|
|
||||||
this.firstFrame = '__BASE';
|
this.firstFrame = '__BASE';
|
||||||
|
|
||||||
this.frameTotal = 0;
|
this.frameTotal = 0;
|
||||||
|
|
|
@ -323,6 +323,21 @@ var TextureManager = new Class({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getTextureKeys: function ()
|
||||||
|
{
|
||||||
|
var output = [];
|
||||||
|
|
||||||
|
for (var key in this.list)
|
||||||
|
{
|
||||||
|
if (key !== '__DEFAULT' && key !== '__MISSING')
|
||||||
|
{
|
||||||
|
output.push(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
},
|
||||||
|
|
||||||
getPixel: function (x, y, key, frame)
|
getPixel: function (x, y, key, frame)
|
||||||
{
|
{
|
||||||
var textureFrame = this.getFrame(key, frame);
|
var textureFrame = this.getFrame(key, frame);
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
var Clone = require('../../utils/object/Clone');
|
||||||
|
|
||||||
var JSONArray = function (texture, sourceIndex, json)
|
var JSONArray = function (texture, sourceIndex, json)
|
||||||
{
|
{
|
||||||
// Malformed?
|
// Malformed?
|
||||||
|
@ -9,6 +11,7 @@ var JSONArray = function (texture, sourceIndex, json)
|
||||||
|
|
||||||
// Add in a __BASE entry (for the entire atlas)
|
// Add in a __BASE entry (for the entire atlas)
|
||||||
var source = texture.source[sourceIndex];
|
var source = texture.source[sourceIndex];
|
||||||
|
|
||||||
texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
|
texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
|
||||||
|
|
||||||
// By this stage frames is a fully parsed array
|
// By this stage frames is a fully parsed array
|
||||||
|
@ -40,6 +43,27 @@ var JSONArray = function (texture, sourceIndex, json)
|
||||||
newFrame.rotated = true;
|
newFrame.rotated = true;
|
||||||
newFrame.updateUVsInverted();
|
newFrame.updateUVsInverted();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy over any extra data
|
||||||
|
newFrame.customData = Clone(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy over any additional data that was in the JSON to Texture.customData
|
||||||
|
for (var dataKey in json)
|
||||||
|
{
|
||||||
|
if (dataKey === 'frames')
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(json[dataKey]))
|
||||||
|
{
|
||||||
|
texture.customData[dataKey] = json[dataKey].slice(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texture.customData[dataKey] = json[dataKey];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return texture;
|
return texture;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
var Clone = require('../../utils/object/Clone');
|
||||||
|
|
||||||
var JSONHash = function (texture, sourceIndex, json)
|
var JSONHash = function (texture, sourceIndex, json)
|
||||||
{
|
{
|
||||||
// Malformed?
|
// Malformed?
|
||||||
|
@ -9,6 +11,7 @@ var JSONHash = function (texture, sourceIndex, json)
|
||||||
|
|
||||||
// Add in a __BASE entry (for the entire atlas)
|
// Add in a __BASE entry (for the entire atlas)
|
||||||
var source = texture.source[sourceIndex];
|
var source = texture.source[sourceIndex];
|
||||||
|
|
||||||
texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
|
texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
|
||||||
|
|
||||||
// By this stage frames is a fully parsed Object
|
// By this stage frames is a fully parsed Object
|
||||||
|
@ -40,6 +43,27 @@ var JSONHash = function (texture, sourceIndex, json)
|
||||||
newFrame.rotated = true;
|
newFrame.rotated = true;
|
||||||
newFrame.updateUVsInverted();
|
newFrame.updateUVsInverted();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy over any extra data
|
||||||
|
newFrame.customData = Clone(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy over any additional data that was in the JSON to Texture.customData
|
||||||
|
for (var dataKey in json)
|
||||||
|
{
|
||||||
|
if (dataKey === 'frames')
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(json[dataKey]))
|
||||||
|
{
|
||||||
|
texture.customData[dataKey] = json[dataKey].slice(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texture.customData[dataKey] = json[dataKey];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return texture;
|
return texture;
|
||||||
|
|
Loading…
Reference in a new issue