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 = {