From 13c99f3491d970e25f80d7413577952104bb7e5e Mon Sep 17 00:00:00 2001 From: photonstorm Date: Tue, 25 Feb 2014 14:46:48 +0000 Subject: [PATCH] Phaser.StageScaleMode has been renamed to ScaleManager and moved from the system folder to the core folder. It's still available under game.scale. If your game references the old Phaser.StageScaleMode consts like SHOW_ALL you need to update them to Phaser.ScaleManager, i.e. Phaser.ScaleManager.SHOW_ALL. All of the Project Templates have been updated to reflect the above change. --- Gruntfile.js | 2 +- README.md | 2 + build/config.php | 2 +- examples/_site/view_full.html | 2 +- examples/_site/view_lite.html | 2 +- examples/wip/autoscroll.js | 4 + examples/wip/destroy state swap.js | 36 ++++++ examples/wip/destroy state.js | 77 +++++++++++++ examples/wip/state parameters.js | 2 +- resources/Project Templates/Basic/Boot.js | 26 ++--- resources/Project Templates/Basic/Game.js | 5 +- resources/Project Templates/Basic/MainMenu.js | 2 +- .../Project Templates/Basic/Preloader.js | 2 +- .../Full Screen Mobile/src/Boot.js | 46 ++++---- .../Full Screen Mobile/src/Game.js | 2 +- .../Full Screen Mobile/src/MainMenu.js | 2 +- .../Full Screen Mobile/src/Preloader.js | 2 +- src/core/Game.js | 5 +- .../ScaleManager.js} | 72 ++++++------ src/core/State.js | 30 ++--- src/core/StateManager.js | 108 ++++++++++++++++-- src/input/Input.js | 2 +- 22 files changed, 321 insertions(+), 112 deletions(-) create mode 100644 examples/wip/destroy state swap.js create mode 100644 examples/wip/destroy state.js rename src/{system/StageScaleMode.js => core/ScaleManager.js} (91%) diff --git a/Gruntfile.js b/Gruntfile.js index 64646566..09d7c5a4 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -70,6 +70,7 @@ module.exports = function (grunt) { 'src/core/Stage.js', 'src/core/Group.js', 'src/core/World.js', + 'src/core/ScaleManager.js', 'src/core/Game.js', 'src/input/Input.js', @@ -100,7 +101,6 @@ module.exports = function (grunt) { 'src/gameobjects/BitmapFont.js', 'src/system/Canvas.js', - 'src/system/StageScaleMode.js', 'src/system/Device.js', 'src/system/RequestAnimationFrame.js', diff --git a/README.md b/README.md index be9497c2..140dedb5 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,8 @@ Significant API changes: * Keyboard.removeKey has been removed. The way the new keyboard manager works means it's no longer required. * When a game un-pauses (from a visibility loss) it resets all Input components. * Time.advancedTiming is a new boolean property. If true Time.fps, fpsMin, fpsMax, frames, msMin and msMax will be calculated, otherwise they remain at their defaults. +* Phaser.StageScaleMode has been renamed to ScaleManager and moved from the system folder to the core folder. It's still available under game.scale. +* If your game references the old Phaser.StageScaleMode consts like SHOW_ALL you need to update them to Phaser.ScaleManager, i.e. Phaser.ScaleManager.SHOW_ALL. New features: diff --git a/build/config.php b/build/config.php index 52ee0cc0..b9aabfcb 100644 --- a/build/config.php +++ b/build/config.php @@ -117,6 +117,7 @@ + @@ -146,7 +147,6 @@ - diff --git a/examples/_site/view_full.html b/examples/_site/view_full.html index 47985140..1bbe7649 100644 --- a/examples/_site/view_full.html +++ b/examples/_site/view_full.html @@ -71,6 +71,7 @@ + @@ -101,7 +102,6 @@ - diff --git a/examples/_site/view_lite.html b/examples/_site/view_lite.html index 0455a4e3..b9b3c73d 100644 --- a/examples/_site/view_lite.html +++ b/examples/_site/view_lite.html @@ -71,6 +71,7 @@ + @@ -101,7 +102,6 @@ - diff --git a/examples/wip/autoscroll.js b/examples/wip/autoscroll.js index 08164fb5..21debbb7 100644 --- a/examples/wip/autoscroll.js +++ b/examples/wip/autoscroll.js @@ -20,6 +20,10 @@ function create() { sprite = game.add.tileSprite(0, 0, 800, 600, 'starfield'); sprite.autoScroll(0, 200); + game.add.image(200, 200, 'mummy'); + + game.world.scale.set(2); + } function update() { diff --git a/examples/wip/destroy state swap.js b/examples/wip/destroy state swap.js new file mode 100644 index 00000000..1566d92a --- /dev/null +++ b/examples/wip/destroy state swap.js @@ -0,0 +1,36 @@ + +var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render }); + +function preload() { + + game.load.spritesheet('mummy', 'assets/sprites/metalslug_mummy37x45.png', 37, 45, 18); + +} + +var mummy; +var anim; + +function create() { + + game.stage.backgroundColor = 0xff8855; + + mummy = game.add.sprite(300, 200, 'mummy', 5); + + mummy.animations.updateIfVisible = false; + + anim = mummy.animations.add('walk'); + + anim.play(2, false); + // anim.play(2, true); + +} + +function update() { + +} + +function render() { + + game.debug.renderText(anim.frame + ' / 17', 32, 32); + +} \ No newline at end of file diff --git a/examples/wip/destroy state.js b/examples/wip/destroy state.js new file mode 100644 index 00000000..82733818 --- /dev/null +++ b/examples/wip/destroy state.js @@ -0,0 +1,77 @@ +var BasicGame = {}; + +BasicGame.Boot = function (game) { +}; + +BasicGame.Boot.prototype = { + + preload: function () { + + this.load.spritesheet('mummy', 'assets/sprites/metalslug_mummy37x45.png', 37, 45, 18); + + }, + + create: function () { + + this.state.start('MainMenu'); + + } + +}; + +BasicGame.MainMenu = function (game) { + + this.mummy; + this.anim; + +}; + +BasicGame.MainMenu.prototype = { + + create: function () { + + this.stage.backgroundColor = 0x2d2d2d; + + this.mummy = this.add.sprite(200, 400, 'mummy'); + + this.anim = this.mummy.animations.add('walk'); + + this.anim.play(10, false); + + this.mummy.events.onAnimationComplete.add(this.changeIt, this); + + }, + + changeIt: function () { + + this.state.start('GameOver'); + + } + +}; + +BasicGame.GameOver = function (game) { + + this.dude; + +}; + +BasicGame.GameOver.prototype = { + + create: function () { + + this.stage.backgroundColor = 0xff7744; + + this.dude = this.add.sprite(300, 300, 'mummy'); + + } + +}; + +var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example'); + +game.state.add('Boot', BasicGame.Boot); +game.state.add('MainMenu', BasicGame.MainMenu); +game.state.add('GameOver', BasicGame.GameOver); + +game.state.start('Boot'); diff --git a/examples/wip/state parameters.js b/examples/wip/state parameters.js index 32fc5881..c88ba121 100644 --- a/examples/wip/state parameters.js +++ b/examples/wip/state parameters.js @@ -89,4 +89,4 @@ game.state.add('Boot', BasicGame.Boot); game.state.add('Preloader', BasicGame.Preloader); game.state.add('MainMenu', BasicGame.MainMenu); -game.state.start('Boot', true, false, 'hello', 'world'); +game.state.start('Boot'); diff --git a/resources/Project Templates/Basic/Boot.js b/resources/Project Templates/Basic/Boot.js index ec45e6e2..2c7ec303 100644 --- a/resources/Project Templates/Basic/Boot.js +++ b/resources/Project Templates/Basic/Boot.js @@ -1,4 +1,4 @@ -BasicGame = {}; +var BasicGame = {}; BasicGame.Boot = function (game) { @@ -17,33 +17,33 @@ BasicGame.Boot.prototype = { create: function () { // Unless you specifically know your game needs to support multi-touch I would recommend setting this to 1 - this.game.input.maxPointers = 1; + this.input.maxPointers = 1; // Phaser will automatically pause if the browser tab the game is in loses focus. You can disable that here: - this.game.stage.disableVisibilityChange = true; + this.stage.disableVisibilityChange = true; if (this.game.device.desktop) { // If you have any desktop specific settings, they can go in here - this.game.stage.scale.pageAlignHorizontally = true; + this.scale.pageAlignHorizontally = true; } else { // Same goes for mobile settings. // In this case we're saying "scale the game, no lower than 480x260 and no higher than 1024x768" - this.game.stage.scaleMode = Phaser.StageScaleMode.SHOW_ALL; - this.game.stage.scale.minWidth = 480; - this.game.stage.scale.minHeight = 260; - this.game.stage.scale.maxWidth = 1024; - this.game.stage.scale.maxHeight = 768; - this.game.stage.scale.forceLandscape = true; - this.game.stage.scale.pageAlignHorizontally = true; - this.game.stage.scale.setScreenSize(true); + this.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL; + this.scale.minWidth = 480; + this.scale.minHeight = 260; + this.scale.maxWidth = 1024; + this.scale.maxHeight = 768; + this.scale.forceLandscape = true; + this.scale.pageAlignHorizontally = true; + this.scale.setScreenSize(true); } // By this point the preloader assets have loaded to the cache, we've set the game settings // So now let's start the real preloader going - this.game.state.start('Preloader'); + this.state.start('Preloader'); } diff --git a/resources/Project Templates/Basic/Game.js b/resources/Project Templates/Basic/Game.js index 6190533d..ed01da7c 100644 --- a/resources/Project Templates/Basic/Game.js +++ b/resources/Project Templates/Basic/Game.js @@ -13,7 +13,8 @@ BasicGame.Game = function (game) { this.sound; // the sound manager - add a sound, play one, set-up markers, etc this.stage; // the game stage this.time; // the clock - this.tweens; // the tween manager + this.tweens; // the tween manager + this.state; // the state manager this.world; // the game world this.particles; // the particle manager this.physics; // the physics manager @@ -44,7 +45,7 @@ BasicGame.Game.prototype = { // Stop music, delete sprites, purge caches, free resources, all that good stuff. // Then let's go back to the main menu. - this.game.state.start('MainMenu'); + this.state.start('MainMenu'); } diff --git a/resources/Project Templates/Basic/MainMenu.js b/resources/Project Templates/Basic/MainMenu.js index fe2a1ae1..7e8c2378 100644 --- a/resources/Project Templates/Basic/MainMenu.js +++ b/resources/Project Templates/Basic/MainMenu.js @@ -35,7 +35,7 @@ BasicGame.MainMenu.prototype = { this.music.stop(); // And start the actual game - this.game.state.start('Game'); + this.state.start('Game'); } diff --git a/resources/Project Templates/Basic/Preloader.js b/resources/Project Templates/Basic/Preloader.js index 1eefba51..e0a16ef9 100644 --- a/resources/Project Templates/Basic/Preloader.js +++ b/resources/Project Templates/Basic/Preloader.js @@ -53,7 +53,7 @@ BasicGame.Preloader.prototype = { if (this.cache.isSoundDecoded('titleMusic') && this.ready == false) { this.ready = true; - this.game.state.start('MainMenu'); + this.state.start('MainMenu'); } } diff --git a/resources/Project Templates/Full Screen Mobile/src/Boot.js b/resources/Project Templates/Full Screen Mobile/src/Boot.js index 80f96731..9ad03474 100644 --- a/resources/Project Templates/Full Screen Mobile/src/Boot.js +++ b/resources/Project Templates/Full Screen Mobile/src/Boot.js @@ -26,37 +26,37 @@ BasicGame.Boot.prototype = { create: function () { - this.game.input.maxPointers = 1; - this.game.stage.disableVisibilityChange = true; + this.input.maxPointers = 1; + this.stage.disableVisibilityChange = true; if (this.game.device.desktop) { - this.game.stage.scaleMode = Phaser.StageScaleMode.SHOW_ALL; - this.game.stage.scale.minWidth = 480; - this.game.stage.scale.minHeight = 260; - this.game.stage.scale.maxWidth = 1024; - this.game.stage.scale.maxHeight = 768; - this.game.stage.scale.pageAlignHorizontally = true; - this.game.stage.scale.pageAlignVertically = true; - this.game.stage.scale.setScreenSize(true); + this.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL; + this.scale.minWidth = 480; + this.scale.minHeight = 260; + this.scale.maxWidth = 1024; + this.scale.maxHeight = 768; + this.scale.pageAlignHorizontally = true; + this.scale.pageAlignVertically = true; + this.scale.setScreenSize(true); } else { - this.game.stage.scaleMode = Phaser.StageScaleMode.SHOW_ALL; - this.game.stage.scale.minWidth = 480; - this.game.stage.scale.minHeight = 260; - this.game.stage.scale.maxWidth = 1024; - this.game.stage.scale.maxHeight = 768; - this.game.stage.scale.pageAlignHorizontally = true; - this.game.stage.scale.pageAlignVertically = true; - this.game.stage.scale.forceOrientation(true, false); - this.game.stage.scale.hasResized.add(this.gameResized, this); - this.game.stage.scale.enterIncorrectOrientation.add(this.enterIncorrectOrientation, this); - this.game.stage.scale.leaveIncorrectOrientation.add(this.leaveIncorrectOrientation, this); - this.game.stage.scale.setScreenSize(true); + this.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL; + this.scale.minWidth = 480; + this.scale.minHeight = 260; + this.scale.maxWidth = 1024; + this.scale.maxHeight = 768; + this.scale.pageAlignHorizontally = true; + this.scale.pageAlignVertically = true; + this.scale.forceOrientation(true, false); + this.scale.hasResized.add(this.gameResized, this); + this.scale.enterIncorrectOrientation.add(this.enterIncorrectOrientation, this); + this.scale.leaveIncorrectOrientation.add(this.leaveIncorrectOrientation, this); + this.scale.setScreenSize(true); } - this.game.state.start('Preloader'); + this.state.start('Preloader'); }, diff --git a/resources/Project Templates/Full Screen Mobile/src/Game.js b/resources/Project Templates/Full Screen Mobile/src/Game.js index 6190533d..8408949d 100644 --- a/resources/Project Templates/Full Screen Mobile/src/Game.js +++ b/resources/Project Templates/Full Screen Mobile/src/Game.js @@ -44,7 +44,7 @@ BasicGame.Game.prototype = { // Stop music, delete sprites, purge caches, free resources, all that good stuff. // Then let's go back to the main menu. - this.game.state.start('MainMenu'); + this.state.start('MainMenu'); } diff --git a/resources/Project Templates/Full Screen Mobile/src/MainMenu.js b/resources/Project Templates/Full Screen Mobile/src/MainMenu.js index fe2a1ae1..7e8c2378 100644 --- a/resources/Project Templates/Full Screen Mobile/src/MainMenu.js +++ b/resources/Project Templates/Full Screen Mobile/src/MainMenu.js @@ -35,7 +35,7 @@ BasicGame.MainMenu.prototype = { this.music.stop(); // And start the actual game - this.game.state.start('Game'); + this.state.start('Game'); } diff --git a/resources/Project Templates/Full Screen Mobile/src/Preloader.js b/resources/Project Templates/Full Screen Mobile/src/Preloader.js index 434061bb..d57bd9c3 100644 --- a/resources/Project Templates/Full Screen Mobile/src/Preloader.js +++ b/resources/Project Templates/Full Screen Mobile/src/Preloader.js @@ -53,7 +53,7 @@ BasicGame.Preloader.prototype = { if (this.cache.isSoundDecoded('titleMusic') && this.ready == false) { this.ready = true; - this.game.state.start('MainMenu'); + this.state.start('MainMenu'); } } diff --git a/src/core/Game.js b/src/core/Game.js index eb779f83..861a2b85 100644 --- a/src/core/Game.js +++ b/src/core/Game.js @@ -142,7 +142,7 @@ Phaser.Game = function (width, height, renderer, parent, state, transparent, ant this.net = null; /** - * @property {Phaser.StageScaleMode} scale - The game scale manager. + * @property {Phaser.ScaleManager} scale - The game scale manager. */ this.scale = null; @@ -446,7 +446,7 @@ Phaser.Game.prototype = { this.rnd = new Phaser.RandomDataGenerator([(Date.now() * Math.random()).toString()]); this.stage = new Phaser.Stage(this, this.width, this.height); - this.scale = new Phaser.StageScaleMode(this, this.width, this.height); + this.scale = new Phaser.ScaleManager(this, this.width, this.height); this.setUpRenderer(); @@ -636,6 +636,7 @@ Phaser.Game.prototype = { this.pendingStep = true; } + this.state.preUpdate(); this.plugins.preUpdate(); this.stage.preUpdate(); diff --git a/src/system/StageScaleMode.js b/src/core/ScaleManager.js similarity index 91% rename from src/system/StageScaleMode.js rename to src/core/ScaleManager.js index 6702c69e..dd6af364 100644 --- a/src/system/StageScaleMode.js +++ b/src/core/ScaleManager.js @@ -5,15 +5,15 @@ */ /** -* The StageScaleMode object is responsible for helping you manage the scaling, resizing and alignment of your game within the browser. +* The ScaleManager object is responsible for helping you manage the scaling, resizing and alignment of your game within the browser. * -* @class Phaser.StageScaleMode +* @class Phaser.ScaleManager * @constructor * @param {Phaser.Game} game - A reference to the currently running game. * @param {number} width - The native width of the game. * @param {number} height - The native height of the game. */ -Phaser.StageScaleMode = function (game, width, height) { +Phaser.ScaleManager = function (game, width, height) { /** * @property {Phaser.Game} game - A reference to the currently running game. @@ -175,12 +175,12 @@ Phaser.StageScaleMode = function (game, width, height) { /** * @property {number} scaleMode - The current scaleMode. */ - this.scaleMode = Phaser.StageScaleMode.NO_SCALE; + this.scaleMode = Phaser.ScaleManager.NO_SCALE; /* * @property {number} fullScreenScaleMode - Scale mode to be used in fullScreen */ - this.fullScreenScaleMode = Phaser.StageScaleMode.NO_SCALE; + this.fullScreenScaleMode = Phaser.ScaleManager.NO_SCALE; /** * @property {number} _startHeight - Internal cache var. Stage height when starting the game. @@ -228,26 +228,26 @@ Phaser.StageScaleMode = function (game, width, height) { * @constant * @type {number} */ -Phaser.StageScaleMode.EXACT_FIT = 0; +Phaser.ScaleManager.EXACT_FIT = 0; /** * @constant * @type {number} */ -Phaser.StageScaleMode.NO_SCALE = 1; +Phaser.ScaleManager.NO_SCALE = 1; /** * @constant * @type {number} */ -Phaser.StageScaleMode.SHOW_ALL = 2; +Phaser.ScaleManager.SHOW_ALL = 2; -Phaser.StageScaleMode.prototype = { +Phaser.ScaleManager.prototype = { /** * Tries to enter the browser into full screen mode. * Please note that this needs to be supported by the web browser and isn't the same thing as setting your game to fill the browser. - * @method Phaser.StageScaleMode#startFullScreen + * @method Phaser.ScaleManager#startFullScreen * @param {boolean} antialias - You can toggle the anti-alias feature of the canvas before jumping in to full screen (false = retain pixel art, true = smooth art) */ startFullScreen: function (antialias) { @@ -287,7 +287,7 @@ Phaser.StageScaleMode.prototype = { /** * Stops full screen mode if the browser is in it. - * @method Phaser.StageScaleMode#stopFullScreen + * @method Phaser.ScaleManager#stopFullScreen */ stopFullScreen: function () { @@ -308,7 +308,7 @@ Phaser.StageScaleMode.prototype = { /** * Called automatically when the browser enters of leaves full screen mode. - * @method Phaser.StageScaleMode#fullScreenChange + * @method Phaser.ScaleManager#fullScreenChange * @param {Event} event - The fullscreenchange event * @protected */ @@ -318,7 +318,7 @@ Phaser.StageScaleMode.prototype = { if (this.isFullScreen) { - if (this.fullScreenScaleMode === Phaser.StageScaleMode.EXACT_FIT) + if (this.fullScreenScaleMode === Phaser.ScaleManager.EXACT_FIT) { this.game.canvas.style['width'] = '100%'; this.game.canvas.style['height'] = '100%'; @@ -331,7 +331,7 @@ Phaser.StageScaleMode.prototype = { this.scaleFactor.x = this.game.width / this.width; this.scaleFactor.y = this.game.height / this.height; } - else if (this.fullScreenScaleMode === Phaser.StageScaleMode.SHOW_ALL) + else if (this.fullScreenScaleMode === Phaser.ScaleManager.SHOW_ALL) { this.setShowAll(); this.refresh(); @@ -357,7 +357,7 @@ Phaser.StageScaleMode.prototype = { /** * If you need your game to run in only one orientation you can force that to happen. * The optional orientationImage is displayed when the game is in the incorrect orientation. - * @method Phaser.StageScaleMode#forceOrientation + * @method Phaser.ScaleManager#forceOrientation * @param {boolean} forceLandscape - true if the game should run in landscape mode only. * @param {boolean} [forcePortrait=false] - true if the game should run in portrait mode only. * @param {string} [orientationImage=''] - The string of an image in the Phaser.Cache to display when this game is in the incorrect orientation. @@ -402,7 +402,7 @@ Phaser.StageScaleMode.prototype = { /** * Checks if the browser is in the correct orientation for your game (if forceLandscape or forcePortrait have been set) - * @method Phaser.StageScaleMode#checkOrientationState + * @method Phaser.ScaleManager#checkOrientationState */ checkOrientationState: function () { @@ -447,7 +447,7 @@ Phaser.StageScaleMode.prototype = { /** * Handle window.orientationchange events - * @method Phaser.StageScaleMode#checkOrientation + * @method Phaser.ScaleManager#checkOrientation * @param {Event} event - The orientationchange event data. */ checkOrientation: function (event) { @@ -465,7 +465,7 @@ Phaser.StageScaleMode.prototype = { this.enterPortrait.dispatch(this.orientation, false, true); } - if (this.scaleMode !== Phaser.StageScaleMode.NO_SCALE) + if (this.scaleMode !== Phaser.ScaleManager.NO_SCALE) { this.refresh(); } @@ -474,7 +474,7 @@ Phaser.StageScaleMode.prototype = { /** * Handle window.resize events - * @method Phaser.StageScaleMode#checkResize + * @method Phaser.ScaleManager#checkResize * @param {Event} event - The resize event data. */ checkResize: function (event) { @@ -499,7 +499,7 @@ Phaser.StageScaleMode.prototype = { this.enterPortrait.dispatch(this.orientation, false, true); } - if (this.scaleMode !== Phaser.StageScaleMode.NO_SCALE) + if (this.scaleMode !== Phaser.ScaleManager.NO_SCALE) { this.refresh(); } @@ -510,7 +510,7 @@ Phaser.StageScaleMode.prototype = { /** * Re-calculate scale mode and update screen size. - * @method Phaser.StageScaleMode#refresh + * @method Phaser.ScaleManager#refresh */ refresh: function () { @@ -578,22 +578,22 @@ Phaser.StageScaleMode.prototype = { } else if (!this.isFullScreen) { - if (this.scaleMode == Phaser.StageScaleMode.EXACT_FIT) + if (this.scaleMode == Phaser.ScaleManager.EXACT_FIT) { this.setExactFit(); } - else if (this.scaleMode == Phaser.StageScaleMode.SHOW_ALL) + else if (this.scaleMode == Phaser.ScaleManager.SHOW_ALL) { this.setShowAll(); } } else { - if (this.fullScreenScaleMode == Phaser.StageScaleMode.EXACT_FIT) + if (this.fullScreenScaleMode == Phaser.ScaleManager.EXACT_FIT) { this.setExactFit(); } - else if (this.fullScreenScaleMode == Phaser.StageScaleMode.SHOW_ALL) + else if (this.fullScreenScaleMode == Phaser.ScaleManager.SHOW_ALL) { this.setShowAll(); } @@ -608,7 +608,7 @@ Phaser.StageScaleMode.prototype = { /** * Sets the canvas style width and height values based on minWidth/Height and maxWidth/Height. - * @method Phaser.StageScaleMode#setSize + * @method Phaser.ScaleManager#setSize */ setSize: function () { @@ -686,7 +686,7 @@ Phaser.StageScaleMode.prototype = { /** * Sets this.width equal to window.innerWidth and this.height equal to window.innerHeight - * @method Phaser.StageScaleMode#setMaximum + * @method Phaser.ScaleManager#setMaximum */ setMaximum: function () { @@ -697,7 +697,7 @@ Phaser.StageScaleMode.prototype = { /** * Calculates the multiplier needed to scale the game proportionally. - * @method Phaser.StageScaleMode#setShowAll + * @method Phaser.ScaleManager#setShowAll */ setShowAll: function () { @@ -710,7 +710,7 @@ Phaser.StageScaleMode.prototype = { /** * Sets the width and height values of the canvas, no larger than the maxWidth/Height. - * @method Phaser.StageScaleMode#setExactFit + * @method Phaser.ScaleManager#setExactFit */ setExactFit: function () { @@ -739,14 +739,14 @@ Phaser.StageScaleMode.prototype = { }; -Phaser.StageScaleMode.prototype.constructor = Phaser.StageScaleMode; +Phaser.ScaleManager.prototype.constructor = Phaser.ScaleManager; /** -* @name Phaser.StageScaleMode#isFullScreen +* @name Phaser.ScaleManager#isFullScreen * @property {boolean} isFullScreen - Returns true if the browser is in full screen mode, otherwise false. * @readonly */ -Object.defineProperty(Phaser.StageScaleMode.prototype, "isFullScreen", { +Object.defineProperty(Phaser.ScaleManager.prototype, "isFullScreen", { get: function () { @@ -757,11 +757,11 @@ Object.defineProperty(Phaser.StageScaleMode.prototype, "isFullScreen", { }); /** -* @name Phaser.StageScaleMode#isPortrait +* @name Phaser.ScaleManager#isPortrait * @property {boolean} isPortrait - Returns true if the browser dimensions match a portrait display. * @readonly */ -Object.defineProperty(Phaser.StageScaleMode.prototype, "isPortrait", { +Object.defineProperty(Phaser.ScaleManager.prototype, "isPortrait", { get: function () { return this.orientation === 0 || this.orientation == 180; @@ -770,11 +770,11 @@ Object.defineProperty(Phaser.StageScaleMode.prototype, "isPortrait", { }); /** -* @name Phaser.StageScaleMode#isLandscape +* @name Phaser.ScaleManager#isLandscape * @property {boolean} isLandscape - Returns true if the browser dimensions match a landscape display. * @readonly */ -Object.defineProperty(Phaser.StageScaleMode.prototype, "isLandscape", { +Object.defineProperty(Phaser.ScaleManager.prototype, "isLandscape", { get: function () { return this.orientation === 90 || this.orientation === -90; diff --git a/src/core/State.js b/src/core/State.js index 1a624167..24df3ea9 100644 --- a/src/core/State.js +++ b/src/core/State.js @@ -21,82 +21,84 @@ Phaser.State = function () { /** * @property {Phaser.GameObjectFactory} add - Reference to the GameObjectFactory. - * @default */ this.add = null; + /** + * @property {Phaser.GameObjectCreator} make - Reference to the GameObjectCreator. + */ + this.make = null; + /** * @property {Phaser.Camera} camera - A handy reference to world.camera. - * @default */ this.camera = null; /** * @property {Phaser.Cache} cache - Reference to the assets cache. - * @default */ this.cache = null; /** * @property {Phaser.Input} input - Reference to the input manager - * @default */ this.input = null; /** * @property {Phaser.Loader} load - Reference to the assets loader. - * @default */ this.load = null; /** * @property {Phaser.Math} math - Reference to the math helper. - * @default */ this.math = null; /** * @property {Phaser.SoundManager} sound - Reference to the sound manager. - * @default */ this.sound = null; + /** + * @property {Phaser.ScaleManager} scale - Reference to the game scale manager. + */ + this.scale = null; + /** * @property {Phaser.Stage} stage - Reference to the stage. - * @default */ this.stage = null; /** * @property {Phaser.TimeManager} time - Reference to game clock. - * @default */ this.time = null; /** * @property {Phaser.TweenManager} tweens - Reference to the tween manager. - * @default */ this.tweens = null; /** * @property {Phaser.World} world - Reference to the world. - * @default */ this.world = null; /** * @property {Phaser.Particles} particles - The Particle Manager for the game. It is called during the game update loop and in turn updates any Emitters attached to it. - * @default */ this.particles = null; /** - * @property {Phaser.Physics.PhysicsManager} physics - Reference to the physics manager. - * @default + * @property {Phaser.Physics.World} physics - Reference to the physics manager. */ this.physics = null; + /** + * @property {Phaser.RandomDataGenerator} rnd - Reference to the random data generator. + */ + this.rnd = null; + }; Phaser.State.prototype = { diff --git a/src/core/StateManager.js b/src/core/StateManager.js index 32c800eb..1515a193 100644 --- a/src/core/StateManager.js +++ b/src/core/StateManager.js @@ -37,6 +37,18 @@ Phaser.StateManager = function (game, pendingState) { this._pendingState = pendingState; } + /** + * @property {boolean} _clearWorld - Clear the world when we switch state? + * @private + */ + this._clearWorld = false; + + /** + * @property {boolean} _clearCache - Clear the cache when we switch state? + * @private + */ + this._clearCache = false; + /** * @property {boolean} _created - Flag that sets if the State has been created or not. * @private @@ -228,7 +240,27 @@ Phaser.StateManager.prototype = { if (typeof clearWorld === "undefined") { clearWorld = true; } if (typeof clearCache === "undefined") { clearCache = false; } - if (this.game.isBooted === false) + if (this.checkState(key)) + { + // Place the state in the queue. It will be started the next time the game loop starts. + this._pendingState = key; + this._clearWorld = clearWorld; + this._clearCache = clearCache; + + if (arguments.length > 3) + { + this._args = Array.prototype.splice.call(arguments, 3); + } + + // Already got a state running? + if (this.current) + { + this.onShutDownCallback.call(this.callbackContext, this.game); + } + } + + +/* if (this.game.isBooted === false) { this._pendingState = key; @@ -251,7 +283,6 @@ Phaser.StateManager.prototype = { this._args = []; } } - if (arguments.length > 3) { this._args = Array.prototype.splice.call(arguments, 3); @@ -305,6 +336,7 @@ Phaser.StateManager.prototype = { // No init? Then there was nothing to load either this.game.loadComplete(); } + */ }, @@ -323,6 +355,64 @@ Phaser.StateManager.prototype = { * @param {string} key - The key of the state you want to check. * @return {boolean} Description. */ + preUpdate: function () { + + if (this._pendingState && this.game.isBooted) + { + // Already got a state running? + if (this.current) + { + this.onShutDownCallback.call(this.callbackContext, this.game); + } + + if (this._clearWorld) + { + this.game.tweens.removeAll(); + + this.game.world.destroy(); + + if (this._clearCache === true) + { + this.game.cache.destroy(); + } + } + + this.setCurrentState(this._pendingState); + + if (this.onPreloadCallback) + { + this.game.load.reset(); + this.onPreloadCallback.call(this.callbackContext, this.game); + + // Is the loader empty? + if (this.game.load.totalQueuedFiles() === 0) + { + this.game.loadComplete(); + } + else + { + // Start the loader going as we have something in the queue + this.game.load.start(); + } + } + else + { + // No init? Then there was nothing to load either + this.game.loadComplete(); + } + + this._pendingState = null; + } + + }, + + /** + * Checks if a given phaser state is valid. A State is considered valid if it has at least one of the core functions: preload, create, update or render. + * + * @method Phaser.StateManager#checkState + * @param {string} key - The key of the state you want to check. + * @return {boolean} true if the State has the required functions, otherwise false. + */ checkState: function (key) { if (this.states[key]) @@ -330,18 +420,13 @@ Phaser.StateManager.prototype = { var valid = false; if (this.states[key]['preload']) { valid = true; } - - if (valid === false && this.states[key]['loadRender']) { valid = true; } - if (valid === false && this.states[key]['loadUpdate']) { valid = true; } - if (valid === false && this.states[key]['create']) { valid = true; } - if (valid === false && this.states[key]['update']) { valid = true; } - if (valid === false && this.states[key]['preRender']) { valid = true; } - if (valid === false && this.states[key]['render']) { valid = true; } - if (valid === false && this.states[key]['paused']) { valid = true; } + if (this.states[key]['create']) { valid = true; } + if (this.states[key]['update']) { valid = true; } + if (this.states[key]['render']) { valid = true; } if (valid === false) { - console.warn("Invalid Phaser State object given. Must contain at least a one of the required functions."); + console.warn("Invalid Phaser State object given. Must contain at least a one of the required functions: preload, create, update or render"); return false; } @@ -373,6 +458,7 @@ Phaser.StateManager.prototype = { this.states[key].math = this.game.math; this.states[key].sound = this.game.sound; this.states[key].scale = this.game.scale; + this.states[key].state = this; this.states[key].stage = this.game.stage; this.states[key].time = this.game.time; this.states[key].tweens = this.game.tweens; diff --git a/src/input/Input.js b/src/input/Input.js index 40967a4b..129de263 100644 --- a/src/input/Input.js +++ b/src/input/Input.js @@ -104,7 +104,7 @@ Phaser.Input = function (game) { this.circle = null; /** - * @property {Phaser.Point} scale - The scale by which all input coordinates are multiplied; calculated by the StageScaleMode. In an un-scaled game the values will be x = 1 and y = 1. + * @property {Phaser.Point} scale - The scale by which all input coordinates are multiplied; calculated by the ScaleManager. In an un-scaled game the values will be x = 1 and y = 1. */ this.scale = null;