diff --git a/examples/assets/fonts/desyrel-pink.png b/examples/assets/fonts/desyrel-pink.png new file mode 100644 index 00000000..264b1dc0 Binary files /dev/null and b/examples/assets/fonts/desyrel-pink.png differ diff --git a/examples/assets/fonts/desyrel-pink.xml b/examples/assets/fonts/desyrel-pink.xml new file mode 100644 index 00000000..54fcdbba --- /dev/null +++ b/examples/assets/fonts/desyrel-pink.xml @@ -0,0 +1,1922 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/bitmapFont1.php b/examples/bitmapFont1.php new file mode 100644 index 00000000..b76db46a --- /dev/null +++ b/examples/bitmapFont1.php @@ -0,0 +1,39 @@ + + + + phaser.js - a new beginning + + + + + + + + \ No newline at end of file diff --git a/examples/fullscreen.php b/examples/fullscreen.php new file mode 100644 index 00000000..ab0e8d1c --- /dev/null +++ b/examples/fullscreen.php @@ -0,0 +1,52 @@ + + + + phaser.js - a new beginning + + + + + + + + + \ No newline at end of file diff --git a/examples/js.php b/examples/js.php index f6e28ea1..82cf5682 100644 --- a/examples/js.php +++ b/examples/js.php @@ -66,6 +66,7 @@ + @@ -88,6 +89,7 @@ + diff --git a/src/core/Game.js b/src/core/Game.js index f2222575..7309284c 100644 --- a/src/core/Game.js +++ b/src/core/Game.js @@ -34,18 +34,206 @@ Phaser.Game = function (width, height, renderer, parent, state, transparent, ant transparent = transparent || false; antialias = antialias || true; + /** + * Phaser Game ID (for when Pixi supports multiple instances) + * @type {number} + */ this.id = Phaser.GAMES.push(this) - 1; + + /** + * The Games DOM parent. + * @type {HTMLElement} + */ this.parent = parent; // Do some more intelligent size parsing here, so they can set "100%" for example, maybe pass the scale mode in here too? + + /** + * The Game width (in pixels). + * @type {number} + */ this.width = width; + + /** + * The Game height (in pixels). + * @type {number} + */ this.height = height; + + /** + * Use a transparent canvas background or not. + * @type {boolean} + */ this.transparent = transparent; + + /** + * Anti-alias graphics (in WebGL this helps with edges, in Canvas2D it retains pixel-art quality) + * @type {boolean} + */ this.antialias = antialias; + + /** + * The Pixi Renderer + * @type {number} + */ this.renderType = renderer; + /** + * The StateManager. + * @type {Phaser.StateManager} + */ this.state = new Phaser.StateManager(this, state); + /** + * Is game paused? + * @type {bool} + */ + this._paused = false; + + /** + * The Renderer this Phaser.Game will use. Either Phaser.RENDERER_AUTO, Phaser.RENDERER_CANVAS or Phaser.RENDERER_WEBGL + * @type {number} + */ + this.renderType = 0; + + /** + * Whether load complete loading or not. + * @type {bool} + */ + this._loadComplete = false; + + /** + * Whether the game engine is booted, aka available. + * @type {bool} + */ + this.isBooted = false; + + /** + * Is game running or paused? + * @type {bool} + */ + this.isRunning = false; + + /** + * Automatically handles the core game loop via requestAnimationFrame or setTimeout + * @type {Phaser.RequestAnimationFrame} + */ + this.raf = null; + + /** + * Reference to the GameObject Factory. + * @type {Phaser.GameObjectFactory} + */ + this.add = null; + + /** + * Reference to the assets cache. + * @type {Phaser.Cache} + */ + this.cache = null; + + /** + * Reference to the input manager + * @type {Phaser.Input} + */ + this.input = null; + + /** + * Reference to the assets loader. + * @type {Phaser.Loader} + */ + this.load = null; + + /** + * Reference to the math helper. + * @type {Phaser.GameMath} + */ + this.math = null; + + /** + * Reference to the network class. + * @type {Phaser.Net} + */ + this.net = null; + + /** + * Reference to the sound manager. + * @type {Phaser.SoundManager} + */ + this.sound = null; + + /** + * Reference to the stage. + * @type {Phaser.Stage} + */ + this.stage = null; + + /** + * Reference to game clock. + * @type {Phaser.TimeManager} + */ + this.time = null; + + /** + * Reference to the tween manager. + * @type {Phaser.TweenManager} + */ + this.tweens = null; + + /** + * Reference to the world. + * @type {Phaser.World} + */ + this.world = null; + + /** + * Reference to the physics manager. + * @type {Phaser.Physics.PhysicsManager} + */ + this.physics = null; + + /** + * Instance of repeatable random data generator helper. + * @type {Phaser.RandomDataGenerator} + */ + this.rnd = null; + + /** + * Contains device information and capabilities. + * @type {Phaser.Device} + */ + this.device = null; + + /** + * A handy reference to world.camera + * @type {Phaser.Camera} + */ + this.camera = null; + + /** + * A handy reference to renderer.view + * @type {HTMLCanvasElement} + */ + this.canvas = null; + + /** + * A handy reference to renderer.context (only set for CANVAS games) + * @type {Context} + */ + this.context = null; + + /** + * A set of useful debug utilities + * @type {Phaser.Utils.Debug} + */ + this.debug = null; + + /** + * The Particle Manager + * @type {Phaser.Particles} + */ + this.particles = null; + var _this = this; this._onBoot = function () { @@ -68,199 +256,6 @@ Phaser.Game = function (width, height, renderer, parent, state, transparent, ant Phaser.Game.prototype = { - // temps so we can clean-up the event listeneres - _tempState: null, - _onBoot: null, - - /** - * Phaser Game ID. - * @type {number} - */ - id: 0, - - /** - * The Game width (in pixels). - * @type {number} - */ - width: 0, - - /** - * The Game height (in pixels). - * @type {number} - */ - height: 0, - - transparent: false, - antialias: true, - - /** - * The Games DOM parent. - * @type {HTMLElement} - */ - parent: '', - - /** - * The Renderer this Phaser.Game will use. Either Phaser.RENDERER_AUTO, Phaser.RENDERER_CANVAS or Phaser.RENDERER_WEBGL - * @type {number} - */ - renderType: 0, - - /** - * The Pixi Renderer - * @type {number} - */ - renderer: null, - - /** - * Whether load complete loading or not. - * @type {bool} - */ - _loadComplete: false, - - /** - * Is game paused? - * @type {bool} - */ - paused: false, - - /** - * Whether the game engine is booted, aka available. - * @type {bool} - */ - isBooted: false, - - /** - * Is game running or paused? - * @type {bool} - */ - isRunning: false, - - /** - * Automatically handles the core game loop via requestAnimationFrame or setTimeout - * @type {Phaser.RequestAnimationFrame} - */ - raf: null, - - /** - * The StateManager. - * @type {Phaser.StateManager} - */ - state: null, - - /** - * Reference to the GameObject Factory. - * @type {Phaser.GameObjectFactory} - */ - add: null, - - /** - * Reference to the assets cache. - * @type {Phaser.Cache} - */ - cache: null, - - /** - * Reference to the input manager - * @type {Phaser.Input} - */ - input: null, - - /** - * Reference to the assets loader. - * @type {Phaser.Loader} - */ - load: null, - - /** - * Reference to the math helper. - * @type {Phaser.GameMath} - */ - math: null, - - /** - * Reference to the network class. - * @type {Phaser.Net} - */ - net: null, - - /** - * Reference to the sound manager. - * @type {Phaser.SoundManager} - */ - sound: null, - - /** - * Reference to the stage. - * @type {Phaser.Stage} - */ - stage: null, - - /** - * Reference to game clock. - * @type {Phaser.TimeManager} - */ - time: null, - - /** - * Reference to the tween manager. - * @type {Phaser.TweenManager} - */ - tweens: null, - - /** - * Reference to the world. - * @type {Phaser.World} - */ - world: null, - - /** - * Reference to the physics manager. - * @type {Phaser.Physics.PhysicsManager} - */ - physics: null, - - /** - * Instance of repeatable random data generator helper. - * @type {Phaser.RandomDataGenerator} - */ - rnd: null, - - /** - * Contains device information and capabilities. - * @type {Phaser.Device} - */ - device: null, - - /** - * A handy reference to world.camera - * @type {Phaser.Camera} - */ - camera: null, - - /** - * A handy reference to renderer.view - * @type {HTMLCanvasElement} - */ - canvas: null, - - /** - * A handy reference to renderer.context (only set for CANVAS games) - * @type {Context} - */ - context: null, - - /** - * A set of useful debug utilities - * @type {Phaser.Utils.Debug} - */ - debug: null, - - /** - * The Particle Manager - * @type {Phaser.Particles} - */ - particles: null, - /** * Initialize engine sub modules and start the game. * @param parent {string} ID of parent Dom element. @@ -385,7 +380,7 @@ Phaser.Game.prototype = { this.time.update(time); - if (!this.paused) + if (!this._paused) { this.plugins.preUpdate(); this.physics.preUpdate(); @@ -426,3 +421,35 @@ Phaser.Game.prototype = { } }; + +Object.defineProperty(Phaser.Game.prototype, "paused", { + + get: function () { + return this._paused; + }, + + set: function (value) { + + if (value === true) + { + if (this._paused == false) + { + this._paused = true; + this.onPause.dispatch(this); + } + } + else + { + if (this._paused) + { + this._paused = false; + this.onResume.dispatch(this); + } + } + + }, + + enumerable: true, + configurable: true +}); + diff --git a/src/core/Stage.js b/src/core/Stage.js index 83c027e9..d33652f9 100644 --- a/src/core/Stage.js +++ b/src/core/Stage.js @@ -23,6 +23,7 @@ Phaser.Stage = function (game, width, height) { this.offset = new Phaser.Point; this.canvas = Phaser.Canvas.create(width, height); + this.canvas.style['-webkit-full-screen'] = 'width: 100%; height: 100%'; // The Pixi Stage which is hooked to the renderer this._stage = new PIXI.Stage(0x000000, false); diff --git a/src/gameobjects/BitmapText.js b/src/gameobjects/BitmapText.js new file mode 100644 index 00000000..74882418 --- /dev/null +++ b/src/gameobjects/BitmapText.js @@ -0,0 +1,117 @@ +Phaser.BitmapText = function (game, x, y, text, style) { + + x = x || 0; + y = y || 0; + text = text || ''; + style = style || ''; + + // If exists = false then the Sprite isn't updated by the core game loop or physics subsystem at all + this.exists = true; + + // This is a handy little var your game can use to determine if a sprite is alive or not, it doesn't effect rendering + this.alive = true; + + this.group = null; + + this.name = ''; + + this.game = game; + + PIXI.BitmapText.call(this, text, style); + + this.position.x = x; + this.position.y = y; + + // Replaces the PIXI.Point with a slightly more flexible one + this.scale = new Phaser.Point(1, 1); + + // Influence of camera movement upon the position + this.scrollFactor = new Phaser.Point(1, 1); + + // A mini cache for storing all of the calculated values + this._cache = { + + dirty: false, + + // Transform cache + a00: 1, a01: 0, a02: x, a10: 0, a11: 1, a12: y, id: 1, + + // The previous calculated position inc. camera x/y and scrollFactor + x: -1, y: -1, + + // The actual scale values based on the worldTransform + scaleX: 1, scaleY: 1 + + }; + + this._cache.x = this.x - (this.game.world.camera.x * this.scrollFactor.x); + this._cache.y = this.y - (this.game.world.camera.y * this.scrollFactor.y); + + this.renderable = true; + +}; + +Phaser.BitmapText.prototype = Phaser.Utils.extend(true, PIXI.BitmapText.prototype); +Phaser.BitmapText.prototype.constructor = Phaser.BitmapText; + +// Add our own custom methods + +/** + * Automatically called by World.update + */ +Phaser.BitmapText.prototype.update = function() { + + if (!this.exists) + { + return; + } + + this._cache.dirty = false; + + this._cache.x = this.x - (this.game.world.camera.x * this.scrollFactor.x); + this._cache.y = this.y - (this.game.world.camera.y * this.scrollFactor.y); + + if (this.position.x != this._cache.x || this.position.y != this._cache.y) + { + this.position.x = this._cache.x; + this.position.y = this._cache.y; + this._cache.dirty = true; + } + +} + +Object.defineProperty(Phaser.BitmapText.prototype, 'angle', { + + get: function() { + return Phaser.Math.radToDeg(this.rotation); + }, + + set: function(value) { + this.rotation = Phaser.Math.degToRad(value); + } + +}); + +Object.defineProperty(Phaser.BitmapText.prototype, 'x', { + + get: function() { + return this.position.x; + }, + + set: function(value) { + this.position.x = value; + } + +}); + +Object.defineProperty(Phaser.BitmapText.prototype, 'y', { + + get: function() { + return this.position.y; + }, + + set: function(value) { + this.position.y = value; + } + +}); diff --git a/src/gameobjects/GameObjectFactory.js b/src/gameobjects/GameObjectFactory.js index fbecff02..3ca561d9 100644 --- a/src/gameobjects/GameObjectFactory.js +++ b/src/gameobjects/GameObjectFactory.js @@ -97,4 +97,10 @@ Phaser.GameObjectFactory.prototype = { }, + bitmapText: function (x, y, text, style) { + + return this.world.add(new Phaser.BitmapText(this.game, x, y, text, style)); + + }, + }; \ No newline at end of file diff --git a/src/loader/Cache.js b/src/loader/Cache.js index cf4a4558..a19ea7b8 100644 --- a/src/loader/Cache.js +++ b/src/loader/Cache.js @@ -108,6 +108,25 @@ Phaser.Cache.prototype = { }, + /** + * Add a new Bitmap Font. + * @param key {string} Asset key for the font texture. + * @param url {string} URL of this font xml file. + * @param data {object} Extra font data. + * @param xmlData {object} Texture atlas frames data. + */ + addBitmapFont: function (key, url, data, xmlData) { + + this._images[key] = { url: url, data: data, spriteSheet: true }; + + PIXI.BaseTextureCache[key] = new PIXI.BaseTexture(data); + PIXI.TextureCache[key] = new PIXI.Texture(PIXI.BaseTextureCache[key]); + + Phaser.Loader.Parser.bitmapFont(this.game, xmlData, key); + // this._images[key].frameData = Phaser.Animation.Parser.XMLData(this.game, xmlData, key); + + }, + /** * Adds a default image to be used when a key is wrong / missing. * Is mapped to the key __default diff --git a/src/loader/Loader.js b/src/loader/Loader.js index 1f69db3b..68de2c11 100644 --- a/src/loader/Loader.js +++ b/src/loader/Loader.js @@ -217,6 +217,64 @@ Phaser.Loader.prototype = { }, + /** + * Add a new bitmap font loading request. + * @param key {string} Unique asset key of the bitmap font. + * @param textureURL {string} The url of the font image file. + * @param [xmlURL] {string} The url of the font data file (xml/fnt) + * @param [xmlData] {object} An optional XML data object. + */ + bitmapFont: function (key, textureURL, xmlURL, xmlData) { + + if (typeof xmlURL === "undefined") { xmlURL = null; } + if (typeof xmlData === "undefined") { xmlData = null; } + + if (this.checkKeyExists(key) === false) + { + // A URL to a json/xml file has been given + if (xmlURL) + { + this.addToFileList('bitmapfont', key, textureURL, { xmlURL: xmlURL }); + } + else + { + // An xml string or object has been given + if (typeof xmlData === 'string') + { + var xml; + + try { + if (window['DOMParser']) + { + var domparser = new DOMParser(); + xml = domparser.parseFromString(xmlData, "text/xml"); + } + else + { + xml = new ActiveXObject("Microsoft.XMLDOM"); + xml.async = 'false'; + xml.loadXML(xmlData); + } + } + catch (e) + { + xml = undefined; + } + + if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) + { + throw new Error("Phaser.Loader. Invalid Bitmap Font XML given"); + } + else + { + this.addToFileList('bitmapfont', key, textureURL, { xmlURL: null, xmlData: xml }); + } + } + } + } + + }, + atlasJSONArray: function (key, textureURL, atlasURL, atlasData) { this.atlas(key, textureURL, atlasURL, atlasData, Phaser.Loader.TEXTURE_ATLAS_JSON_ARRAY); @@ -249,20 +307,22 @@ Phaser.Loader.prototype = { if (typeof atlasData === "undefined") { atlasData = null; } if (typeof format === "undefined") { format = Phaser.Loader.TEXTURE_ATLAS_JSON_ARRAY; } - if (this.checkKeyExists(key) === false) { - + if (this.checkKeyExists(key) === false) + { // A URL to a json/xml file has been given - if (atlasURL) { + if (atlasURL) + { this.addToFileList('textureatlas', key, textureURL, { atlasURL: atlasURL, format: format }); } else { - switch (format) { - + switch (format) + { // A json string or object has been given case Phaser.Loader.TEXTURE_ATLAS_JSON_ARRAY: - if (typeof atlasData === 'string') { + if (typeof atlasData === 'string') + { atlasData = JSON.parse(atlasData); } break; @@ -270,24 +330,34 @@ Phaser.Loader.prototype = { // An xml string or object has been given case Phaser.Loader.TEXTURE_ATLAS_XML_STARLING: - if (typeof atlasData === 'string') { + if (typeof atlasData === 'string') + { var xml; + try { - if (window['DOMParser']) { + if (window['DOMParser']) + { var domparser = new DOMParser(); xml = domparser.parseFromString(atlasData, "text/xml"); - } else { + } + else + { xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = 'false'; xml.loadXML(atlasData); } - } catch (e) { + } + catch (e) + { xml = undefined; } - if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) { + if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) + { throw new Error("Phaser.Loader. Invalid Texture Atlas XML given"); - } else { + } + else + { atlasData = xml; } } @@ -298,7 +368,6 @@ Phaser.Loader.prototype = { } - } }, @@ -367,6 +436,7 @@ Phaser.Loader.prototype = { case 'image': case 'spritesheet': case 'textureatlas': + case 'bitmapfont': file.data = new Image(); file.data.name = file.key; file.data.onload = function () { @@ -537,6 +607,29 @@ Phaser.Loader.prototype = { } break; + case 'bitmapfont': + if (file.xmlURL == null) + { + this.game.cache.addBitmapFont(file.key, file.url, file.data, file.xmlData); + } + else + { + // Load the XML before carrying on with the next file + loadNext = false; + this._xhr.open("GET", this.baseURL + file.xmlURL, true); + this._xhr.responseType = "text"; + + this._xhr.onload = function () { + return _this.xmlLoadComplete(file.key); + }; + + this._xhr.onerror = function () { + return _this.dataLoadError(file.key); + }; + this._xhr.send(); + } + break; + case 'audio': if (this.game.sound.usingWebAudio) @@ -605,7 +698,7 @@ Phaser.Loader.prototype = { file.error = true; - throw new Error("Phaser.Loader dataLoadError: " + key); + console.warn("Phaser.Loader dataLoadError: " + key); this.nextFile(key, true); @@ -613,7 +706,7 @@ Phaser.Loader.prototype = { xmlLoadComplete: function (key) { - var atlasData = this._xhr.response; + var data = this._xhr.response; var xml; try @@ -621,13 +714,13 @@ Phaser.Loader.prototype = { if (window['DOMParser']) { var domparser = new DOMParser(); - xml = domparser.parseFromString(atlasData, "text/xml"); + xml = domparser.parseFromString(data, "text/xml"); } else { xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = 'false'; - xml.loadXML(atlasData); + xml.loadXML(data); } } catch (e) @@ -641,7 +734,15 @@ Phaser.Loader.prototype = { } var file = this._fileList[key]; - this.game.cache.addTextureAtlas(file.key, file.url, file.data, xml, file.format); + + if (file.type == 'bitmapfont') + { + this.game.cache.addBitmapFont(file.key, file.url, file.data, xml); + } + else if (file.type == 'textureatlas') + { + this.game.cache.addTextureAtlas(file.key, file.url, file.data, xml, file.format); + } this.nextFile(key, true); diff --git a/src/loader/Parser.js b/src/loader/Parser.js new file mode 100644 index 00000000..1ef50442 --- /dev/null +++ b/src/loader/Parser.js @@ -0,0 +1,71 @@ +Phaser.Loader.Parser = { + + /** + * Parse frame data from an XML file. + * @param xml {object} XML data you want to parse. + * @return {FrameData} Generated FrameData object. + */ + bitmapFont: function (game, xml, cacheKey) { + + // Malformed? + if (!xml.getElementsByTagName('font')) + { + console.warn("Phaser.Loader.Parser.bitmapFont: Invalid XML given, missing tag"); + return; + } + + var texture = PIXI.TextureCache[cacheKey]; + + var data = {}; + var info = xml.getElementsByTagName("info")[0]; + var common = xml.getElementsByTagName("common")[0]; + data.font = info.attributes.getNamedItem("face").nodeValue; + data.size = parseInt(info.attributes.getNamedItem("size").nodeValue, 10); + data.lineHeight = parseInt(common.attributes.getNamedItem("lineHeight").nodeValue, 10); + data.chars = {}; + + //parse letters + var letters = xml.getElementsByTagName("char"); + + for (var i = 0; i < letters.length; i++) + { + var charCode = parseInt(letters[i].attributes.getNamedItem("id").nodeValue, 10); + + var textureRect = { + x: parseInt(letters[i].attributes.getNamedItem("x").nodeValue, 10), + y: parseInt(letters[i].attributes.getNamedItem("y").nodeValue, 10), + width: parseInt(letters[i].attributes.getNamedItem("width").nodeValue, 10), + height: parseInt(letters[i].attributes.getNamedItem("height").nodeValue, 10) + }; + + // Note: This means you can only have 1 BitmapFont loaded at once! + // Need to replace this with our own handler soon. + PIXI.TextureCache[charCode] = new PIXI.Texture(texture, textureRect); + + data.chars[charCode] = { + xOffset: parseInt(letters[i].attributes.getNamedItem("xoffset").nodeValue, 10), + yOffset: parseInt(letters[i].attributes.getNamedItem("yoffset").nodeValue, 10), + xAdvance: parseInt(letters[i].attributes.getNamedItem("xadvance").nodeValue, 10), + kerning: {}, + texture:new PIXI.Texture(texture, textureRect) + + }; + } + + //parse kernings + var kernings = xml.getElementsByTagName("kerning"); + + for (i = 0; i < kernings.length; i++) + { + var first = parseInt(kernings[i].attributes.getNamedItem("first").nodeValue, 10); + var second = parseInt(kernings[i].attributes.getNamedItem("second").nodeValue, 10); + var amount = parseInt(kernings[i].attributes.getNamedItem("amount").nodeValue, 10); + + data.chars[second].kerning[first] = amount; + } + + PIXI.BitmapText.fonts[data.font] = data; + + } + +}; \ No newline at end of file diff --git a/src/system/StageScaleMode.js b/src/system/StageScaleMode.js index 92f23814..50cfe6d2 100644 --- a/src/system/StageScaleMode.js +++ b/src/system/StageScaleMode.js @@ -144,9 +144,12 @@ Phaser.StageScaleMode.prototype = { } else if (element['webkitRequestFullScreen']) { - element['webkitRequestFullScreen'](); + element['webkitRequestFullScreen'](Element.ALLOW_KEYBOARD_INPUT); } + this.game.stage.canvas.style['width'] = '100%'; + this.game.stage.canvas.style['height'] = '100%'; + }, stopFullScreen: function () { diff --git a/src/time/Time.js b/src/time/Time.js index c7cbedc0..9009bd52 100644 --- a/src/time/Time.js +++ b/src/time/Time.js @@ -158,6 +158,10 @@ Phaser.Time = function (game) { */ this.lastTime = 0; + // Listen for game pause/resume events + this.game.onPause.add(this.gamePaused, this); + this.game.onResume.add(this.gameResumed, this); + }; Phaser.Time.prototype = { @@ -229,7 +233,6 @@ Phaser.Time.prototype = { // Level out the elapsed timer to avoid spikes this.elapsed = 0; this.physicsElapsed = 0; - this.time = Date.now(); this.pauseDuration = this.pausedTime; }, diff --git a/src/tween/TweenManager.js b/src/tween/TweenManager.js index c7e577a3..ddf5bfe8 100644 --- a/src/tween/TweenManager.js +++ b/src/tween/TweenManager.js @@ -14,6 +14,9 @@ Phaser.TweenManager = function (game) { this.game = game; this._tweens = []; + this.game.onPause.add(this.pauseAll, this); + this.game.onResume.add(this.resumeAll, this); + }; Phaser.TweenManager.prototype = {