2018-02-12 16:01:20 +00:00
|
|
|
/**
|
|
|
|
* @author Richard Davey <rich@photonstorm.com>
|
|
|
|
* @copyright 2018 Photon Storm Ltd.
|
|
|
|
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
|
|
|
*/
|
|
|
|
|
2018-01-25 00:48:48 +00:00
|
|
|
var AddToDOM = require('../dom/AddToDOM');
|
|
|
|
var AnimationManager = require('../animations/AnimationManager');
|
|
|
|
var CacheManager = require('../cache/CacheManager');
|
2018-01-31 03:38:10 +00:00
|
|
|
var CanvasPool = require('../display/canvas/CanvasPool');
|
2017-06-30 14:47:51 +00:00
|
|
|
var Class = require('../utils/Class');
|
2016-11-24 01:35:02 +00:00
|
|
|
var Config = require('./Config');
|
2018-07-18 16:22:52 +00:00
|
|
|
var CreateDOMContainer = require('./CreateDOMContainer');
|
2018-01-25 00:48:48 +00:00
|
|
|
var CreateRenderer = require('./CreateRenderer');
|
2018-01-31 03:38:10 +00:00
|
|
|
var DataManager = require('../data/DataManager');
|
2016-11-22 03:32:41 +00:00
|
|
|
var DebugHeader = require('./DebugHeader');
|
2016-12-13 16:12:25 +00:00
|
|
|
var Device = require('../device');
|
2016-11-25 02:08:33 +00:00
|
|
|
var DOMContentLoaded = require('../dom/DOMContentLoaded');
|
2018-01-12 17:09:09 +00:00
|
|
|
var EventEmitter = require('eventemitter3');
|
2018-01-16 16:14:21 +00:00
|
|
|
var InputManager = require('../input/InputManager');
|
2018-05-10 16:14:33 +00:00
|
|
|
var PluginManager = require('../plugins/PluginManager');
|
2018-01-16 16:33:23 +00:00
|
|
|
var SceneManager = require('../scene/SceneManager');
|
2018-01-16 02:08:04 +00:00
|
|
|
var SoundManagerCreator = require('../sound/SoundManagerCreator');
|
2017-01-16 22:43:46 +00:00
|
|
|
var TextureManager = require('../textures/TextureManager');
|
2017-06-28 16:17:31 +00:00
|
|
|
var TimeStep = require('./TimeStep');
|
2018-01-25 00:48:48 +00:00
|
|
|
var VisibilityHandler = require('./VisibilityHandler');
|
2016-11-22 03:11:33 +00:00
|
|
|
|
2018-02-07 15:27:21 +00:00
|
|
|
/**
|
|
|
|
* @classdesc
|
|
|
|
* The Phaser.Game instance is the main controller for the entire Phaser game. It is responsible
|
|
|
|
* for handling the boot process, parsing the configuration values, creating the renderer,
|
|
|
|
* and setting-up all of the global Phaser systems, such as sound and input.
|
|
|
|
* Once that is complete it will start the Scene Manager and then begin the main game loop.
|
|
|
|
*
|
|
|
|
* You should generally avoid accessing any of the systems created by Game, and instead use those
|
|
|
|
* made available to you via the Phaser.Scene Systems class instead.
|
|
|
|
*
|
|
|
|
* @class Game
|
|
|
|
* @memberOf Phaser
|
|
|
|
* @constructor
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-03-27 11:30:00 +00:00
|
|
|
* @param {GameConfig} [GameConfig] - The configuration object for your Phaser Game instance.
|
2018-02-07 15:27:21 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
var Game = new Class({
|
2016-11-24 01:35:02 +00:00
|
|
|
|
2017-06-30 14:47:51 +00:00
|
|
|
initialize:
|
2016-11-24 17:01:52 +00:00
|
|
|
|
2017-06-30 14:47:51 +00:00
|
|
|
function Game (config)
|
|
|
|
{
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* The parsed Game Configuration object.
|
2018-03-05 16:15:16 +00:00
|
|
|
*
|
2018-01-25 00:48:48 +00:00
|
|
|
* The values stored within this object are read-only and should not be changed at run-time.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#config
|
|
|
|
* @type {Phaser.Boot.Config}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @readOnly
|
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.config = new Config(config);
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* A reference to either the Canvas or WebGL Renderer that this Game is using.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#renderer
|
2018-03-20 14:58:02 +00:00
|
|
|
* @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.renderer = null;
|
2017-10-04 22:48:16 +00:00
|
|
|
|
2018-07-18 16:22:52 +00:00
|
|
|
/**
|
|
|
|
* A reference to an HTML Div Element used as a DOM Element Container.
|
|
|
|
*
|
|
|
|
* Only set if `createDOMContainer` is `true` in the game config (by default it is `false`) and
|
|
|
|
* if you provide a parent element to insert the Phaser Game inside.
|
|
|
|
*
|
|
|
|
* See the DOM Element Game Object for more details.
|
|
|
|
*
|
|
|
|
* @name Phaser.Game#domContainer
|
|
|
|
* @type {HTMLDivElement}
|
|
|
|
* @since 3.12.0
|
|
|
|
*/
|
|
|
|
this.domContainer = null;
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-05-10 11:25:33 +00:00
|
|
|
* A reference to the HTML Canvas Element that Phaser uses to render the game.
|
|
|
|
* This is created automatically by Phaser unless you provide a `canvas` property
|
|
|
|
* in your Game Config.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#canvas
|
|
|
|
* @type {HTMLCanvasElement}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.canvas = null;
|
2017-10-04 22:48:16 +00:00
|
|
|
|
|
|
|
/**
|
2018-05-10 11:25:33 +00:00
|
|
|
* A reference to the Rendering Context belonging to the Canvas Element this game is rendering to.
|
|
|
|
* If the game is running under Canvas it will be a 2d Canvas Rendering Context.
|
|
|
|
* If the game is running under WebGL it will be a WebGL Rendering Context.
|
|
|
|
* This context is created automatically by Phaser unless you provide a `context` property
|
|
|
|
* in your Game Config.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#context
|
2018-05-17 14:10:23 +00:00
|
|
|
* @type {(CanvasRenderingContext2D|WebGLRenderingContext)}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.context = null;
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* A flag indicating when this Game instance has finished its boot process.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#isBooted
|
|
|
|
* @type {boolean}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @readOnly
|
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.isBooted = false;
|
2017-10-04 22:48:16 +00:00
|
|
|
|
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* A flag indicating if this Game is currently running its game step or not.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#isRunning
|
|
|
|
* @type {boolean}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @readOnly
|
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.isRunning = false;
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An Event Emitter which is used to broadcast game-level events from the global systems.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#events
|
2018-03-29 12:12:07 +00:00
|
|
|
* @type {Phaser.Events.EventEmitter}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2018-01-12 17:09:09 +00:00
|
|
|
this.events = new EventEmitter();
|
2017-06-30 14:47:51 +00:00
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An instance of the Animation Manager.
|
2018-03-05 16:15:16 +00:00
|
|
|
*
|
2018-01-25 00:48:48 +00:00
|
|
|
* The Animation Manager is a global system responsible for managing all animations used within your game.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#anims
|
|
|
|
* @type {Phaser.Animations.AnimationManager}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.anims = new AnimationManager(this);
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An instance of the Texture Manager.
|
2018-03-05 16:15:16 +00:00
|
|
|
*
|
2018-01-25 00:48:48 +00:00
|
|
|
* The Texture Manager is a global system responsible for managing all textures being used by your game.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#textures
|
|
|
|
* @type {Phaser.Textures.TextureManager}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.textures = new TextureManager(this);
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An instance of the Cache Manager.
|
2018-03-05 16:15:16 +00:00
|
|
|
*
|
2018-01-25 00:48:48 +00:00
|
|
|
* The Cache Manager is a global system responsible for caching, accessing and releasing external game assets.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#cache
|
|
|
|
* @type {Phaser.Cache.CacheManager}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2018-01-16 16:30:11 +00:00
|
|
|
this.cache = new CacheManager(this);
|
2017-06-30 14:47:51 +00:00
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-04-08 19:13:02 +00:00
|
|
|
* An instance of the Data Manager
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#registry
|
|
|
|
* @type {Phaser.Data.DataManager}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2018-01-31 03:38:10 +00:00
|
|
|
this.registry = new DataManager(this);
|
2017-06-30 14:47:51 +00:00
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An instance of the Input Manager.
|
2018-03-05 16:15:16 +00:00
|
|
|
*
|
2018-01-25 00:48:48 +00:00
|
|
|
* The Input Manager is a global system responsible for the capture of browser-level input events.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#input
|
|
|
|
* @type {Phaser.Input.InputManager}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2018-01-16 16:14:21 +00:00
|
|
|
this.input = new InputManager(this, this.config);
|
2017-06-30 14:47:51 +00:00
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An instance of the Scene Manager.
|
2018-03-05 16:15:16 +00:00
|
|
|
*
|
2018-01-25 00:48:48 +00:00
|
|
|
* The Scene Manager is a global system responsible for creating, modifying and updating the Scenes in your game.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#scene
|
|
|
|
* @type {Phaser.Scenes.SceneManager}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2018-01-16 16:33:23 +00:00
|
|
|
this.scene = new SceneManager(this, this.config.sceneConfig);
|
2017-06-30 14:47:51 +00:00
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 17:03:35 +00:00
|
|
|
* A reference to the Device inspector.
|
2018-01-25 00:48:48 +00:00
|
|
|
*
|
|
|
|
* Contains information about the device running this game, such as OS, browser vendor and feature support.
|
|
|
|
* Used by various systems to determine capabilities and code paths.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#device
|
2018-03-21 14:40:30 +00:00
|
|
|
* @type {Phaser.DeviceConf}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.device = Device;
|
|
|
|
|
2017-11-09 13:41:23 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An instance of the base Sound Manager.
|
|
|
|
*
|
|
|
|
* The Sound Manager is a global system responsible for the playback and updating of all audio in your game.
|
2017-11-09 13:41:23 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#sound
|
2018-03-28 14:04:09 +00:00
|
|
|
* @type {Phaser.Sound.BaseSoundManager}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-11-09 13:41:23 +00:00
|
|
|
*/
|
2017-11-10 18:05:26 +00:00
|
|
|
this.sound = SoundManagerCreator.create(this);
|
2017-11-09 13:41:23 +00:00
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An instance of the Time Step.
|
|
|
|
*
|
|
|
|
* The Time Step is a global system responsible for setting-up and responding to the browser frame events, processing
|
|
|
|
* them and calculating delta values. It then automatically calls the game step.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#loop
|
|
|
|
* @type {Phaser.Boot.TimeStep}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.loop = new TimeStep(this, this.config.fps);
|
|
|
|
|
2018-01-16 02:08:04 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* An instance of the Plugin Manager.
|
|
|
|
*
|
|
|
|
* The Plugin Manager is a global system that allows plugins to register themselves with it, and can then install
|
|
|
|
* those plugins into Scenes as required.
|
2018-01-16 02:08:04 +00:00
|
|
|
*
|
2018-02-12 23:13:16 +00:00
|
|
|
* @name Phaser.Game#plugins
|
2018-05-10 16:14:33 +00:00
|
|
|
* @type {Phaser.Plugins.PluginManager}
|
2018-01-25 00:48:48 +00:00
|
|
|
* @since 3.0.0
|
2018-01-16 02:08:04 +00:00
|
|
|
*/
|
|
|
|
this.plugins = new PluginManager(this, this.config);
|
|
|
|
|
2018-04-16 16:02:32 +00:00
|
|
|
/**
|
2018-04-16 16:14:12 +00:00
|
|
|
* Is this Game pending destruction at the start of the next frame?
|
2018-04-16 16:02:32 +00:00
|
|
|
*
|
|
|
|
* @name Phaser.Game#pendingDestroy
|
|
|
|
* @type {boolean}
|
|
|
|
* @private
|
|
|
|
* @since 3.5.0
|
|
|
|
*/
|
|
|
|
this.pendingDestroy = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove the Canvas once the destroy is over?
|
|
|
|
*
|
|
|
|
* @name Phaser.Game#removeCanvas
|
|
|
|
* @type {boolean}
|
|
|
|
* @private
|
|
|
|
* @since 3.5.0
|
|
|
|
*/
|
|
|
|
this.removeCanvas = false;
|
|
|
|
|
2018-05-18 16:37:45 +00:00
|
|
|
/**
|
|
|
|
* Does the window the game is running in currently have focus or not?
|
|
|
|
* This is modified by the VisibilityHandler.
|
|
|
|
*
|
|
|
|
* @name Phaser.Game#hasFocus
|
|
|
|
* @type {boolean}
|
|
|
|
* @readOnly
|
|
|
|
* @since 3.9.0
|
|
|
|
*/
|
|
|
|
this.hasFocus = false;
|
|
|
|
|
2018-06-11 11:32:25 +00:00
|
|
|
/**
|
|
|
|
* Is the mouse pointer currently over the game canvas or not?
|
|
|
|
* This is modified by the VisibilityHandler.
|
|
|
|
*
|
|
|
|
* @name Phaser.Game#isOver
|
|
|
|
* @type {boolean}
|
|
|
|
* @readOnly
|
|
|
|
* @since 3.10.0
|
|
|
|
*/
|
|
|
|
this.isOver = true;
|
|
|
|
|
2017-06-30 14:47:51 +00:00
|
|
|
// Wait for the DOM Ready event, then call boot.
|
|
|
|
DOMContentLoaded(this.boot.bind(this));
|
|
|
|
},
|
2016-11-25 01:37:14 +00:00
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* Game boot event.
|
|
|
|
*
|
|
|
|
* This is an internal event dispatched when the game has finished booting, but before it is ready to start running.
|
|
|
|
* The global systems use this event to know when to set themselves up, dispatching their own `ready` events as required.
|
|
|
|
*
|
|
|
|
* @event Phaser.Game#boot
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This method is called automatically when the DOM is ready. It is responsible for creating the renderer,
|
|
|
|
* displaying the Debug Header, adding the game canvas to the DOM and emitting the 'boot' event.
|
|
|
|
* It listens for a 'ready' event from the base systems and once received it will call `Game.start`.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Game#boot
|
2018-01-25 00:48:48 +00:00
|
|
|
* @protected
|
|
|
|
* @fires Phaser.Game#boot
|
2017-10-04 22:48:16 +00:00
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2016-11-25 02:08:33 +00:00
|
|
|
boot: function ()
|
|
|
|
{
|
2016-11-29 15:25:14 +00:00
|
|
|
this.isBooted = true;
|
|
|
|
|
2018-03-05 16:09:12 +00:00
|
|
|
this.config.preBoot(this);
|
2016-11-28 16:55:13 +00:00
|
|
|
|
2016-11-29 11:26:30 +00:00
|
|
|
CreateRenderer(this);
|
2016-11-25 02:08:33 +00:00
|
|
|
|
2018-07-18 16:22:52 +00:00
|
|
|
CreateDOMContainer(this);
|
|
|
|
|
2017-09-13 14:27:43 +00:00
|
|
|
DebugHeader(this);
|
|
|
|
|
2016-12-07 03:42:41 +00:00
|
|
|
AddToDOM(this.canvas, this.config.parent);
|
|
|
|
|
2018-01-18 05:16:52 +00:00
|
|
|
this.events.emit('boot');
|
2018-01-16 02:08:04 +00:00
|
|
|
|
2018-01-18 14:01:29 +00:00
|
|
|
// The Texture Manager has to wait on a couple of non-blocking events before it's fully ready, so it will emit this event
|
|
|
|
this.events.once('ready', this.start, this);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* Called automatically by Game.boot once all of the global systems have finished setting themselves up.
|
|
|
|
* By this point the Game is now ready to start the main loop running.
|
|
|
|
* It will also enable the Visibility Handler.
|
2018-01-18 14:01:29 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Game#start
|
2018-01-25 00:48:48 +00:00
|
|
|
* @protected
|
2018-01-18 14:01:29 +00:00
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
|
|
|
start: function ()
|
|
|
|
{
|
2016-11-29 15:25:14 +00:00
|
|
|
this.isRunning = true;
|
2016-11-26 01:28:53 +00:00
|
|
|
|
2018-03-05 16:09:12 +00:00
|
|
|
this.config.postBoot(this);
|
2016-11-25 02:08:33 +00:00
|
|
|
|
2018-02-28 21:57:32 +00:00
|
|
|
if (this.renderer)
|
|
|
|
{
|
|
|
|
this.loop.start(this.step.bind(this));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
this.loop.start(this.headlessStep.bind(this));
|
|
|
|
}
|
2017-05-09 00:24:46 +00:00
|
|
|
|
2018-05-18 16:37:45 +00:00
|
|
|
VisibilityHandler(this);
|
2017-05-09 00:24:46 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
var eventEmitter = this.events;
|
|
|
|
|
|
|
|
eventEmitter.on('hidden', this.onHidden, this);
|
|
|
|
eventEmitter.on('visible', this.onVisible, this);
|
|
|
|
eventEmitter.on('blur', this.onBlur, this);
|
|
|
|
eventEmitter.on('focus', this.onFocus, this);
|
2017-04-27 02:11:56 +00:00
|
|
|
},
|
|
|
|
|
2018-05-11 17:55:44 +00:00
|
|
|
/**
|
|
|
|
* Game Pre-Step event.
|
|
|
|
*
|
|
|
|
* This event is dispatched before the main Step starts.
|
|
|
|
* By this point none of the Scene updates have happened.
|
|
|
|
* Hook into it from plugins or systems that need to update before the Scene Manager does.
|
|
|
|
*
|
|
|
|
* @event Phaser.Game#prestepEvent
|
|
|
|
* @param {number} time - [description]
|
|
|
|
* @param {number} delta - [description]
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Game Step event.
|
|
|
|
*
|
|
|
|
* This event is dispatched after Pre-Step and before the Scene Manager steps.
|
|
|
|
* Hook into it from plugins or systems that need to update before the Scene Manager does, but after core Systems.
|
|
|
|
*
|
|
|
|
* @event Phaser.Game#stepEvent
|
|
|
|
* @param {number} time - [description]
|
|
|
|
* @param {number} delta - [description]
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Game Post-Step event.
|
|
|
|
*
|
|
|
|
* This event is dispatched after the Scene Manager has updated.
|
|
|
|
* Hook into it from plugins or systems that need to do things before the render starts.
|
|
|
|
*
|
|
|
|
* @event Phaser.Game#poststepEvent
|
|
|
|
* @param {number} time - [description]
|
|
|
|
* @param {number} delta - [description]
|
|
|
|
*/
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* Game Pre-Render event.
|
|
|
|
*
|
|
|
|
* This event is dispatched immediately before any of the Scenes have started to render.
|
|
|
|
* The renderer will already have been initialized this frame, clearing itself and preparing to receive
|
|
|
|
* the Scenes for rendering, but it won't have actually drawn anything yet.
|
|
|
|
*
|
2018-02-12 23:51:47 +00:00
|
|
|
* @event Phaser.Game#prerenderEvent
|
2018-03-28 14:04:09 +00:00
|
|
|
* @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - A reference to the current renderer.
|
2018-01-25 00:48:48 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Game Post-Render event.
|
|
|
|
*
|
|
|
|
* This event is dispatched right at the end of the render process.
|
|
|
|
* Every Scene will have rendered and drawn to the canvas.
|
|
|
|
*
|
2018-02-12 23:51:47 +00:00
|
|
|
* @event Phaser.Game#postrenderEvent
|
2018-03-28 14:04:09 +00:00
|
|
|
* @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - A reference to the current renderer.
|
2018-01-25 00:48:48 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of
|
|
|
|
* Request Animation Frame, or Set Timeout on very old browsers.)
|
|
|
|
*
|
|
|
|
* The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager.
|
|
|
|
*
|
|
|
|
* It will then render each Scene in turn, via the Renderer. This process emits `prerender` and `postrender` events.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Game#step
|
2018-05-11 17:55:44 +00:00
|
|
|
* @fires Phaser.Game#prestepEvent
|
|
|
|
* @fires Phaser.Game#stepEvent
|
|
|
|
* @fires Phaser.Game#poststepEvent
|
2018-02-12 23:51:47 +00:00
|
|
|
* @fires Phaser.Game#prerenderEvent
|
|
|
|
* @fires Phaser.Game#postrenderEvent
|
2017-10-04 22:48:16 +00:00
|
|
|
* @since 3.0.0
|
|
|
|
*
|
|
|
|
* @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
|
2018-03-18 13:43:37 +00:00
|
|
|
* @param {number} delta - The delta time, in ms, elapsed since the last frame.
|
2017-10-04 22:48:16 +00:00
|
|
|
*/
|
2017-04-27 16:03:19 +00:00
|
|
|
step: function (time, delta)
|
2017-04-27 02:11:56 +00:00
|
|
|
{
|
2018-04-16 16:02:32 +00:00
|
|
|
if (this.pendingDestroy)
|
|
|
|
{
|
|
|
|
return this.runDestroy();
|
|
|
|
}
|
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
var eventEmitter = this.events;
|
2017-04-27 02:11:56 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
// Global Managers like Input and Sound update in the prestep
|
2018-05-10 16:14:33 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
eventEmitter.emit('prestep', time, delta);
|
2017-04-27 02:11:56 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
// This is mostly meant for user-land code and plugins
|
2017-11-26 15:45:07 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
eventEmitter.emit('step', time, delta);
|
2017-04-27 02:11:56 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
// Update the Scene Manager and all active Scenes
|
2017-07-20 10:34:01 +00:00
|
|
|
|
2018-01-20 04:47:03 +00:00
|
|
|
this.scene.update(time, delta);
|
2017-04-27 02:11:56 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
// Our final event before rendering starts
|
|
|
|
|
|
|
|
eventEmitter.emit('poststep', time, delta);
|
2017-04-27 02:11:56 +00:00
|
|
|
|
2018-01-20 04:47:03 +00:00
|
|
|
var renderer = this.renderer;
|
2017-04-27 02:11:56 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
// Run the Pre-render (clearing the canvas, setting background colors, etc)
|
|
|
|
|
2017-04-27 02:11:56 +00:00
|
|
|
renderer.preRender();
|
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
eventEmitter.emit('prerender', renderer, time, delta);
|
|
|
|
|
|
|
|
// The main render loop. Iterates all Scenes and all Cameras in those scenes, rendering to the renderer instance.
|
2018-01-16 02:08:04 +00:00
|
|
|
|
2018-01-20 04:47:03 +00:00
|
|
|
this.scene.render(renderer);
|
2017-04-27 02:11:56 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
// The Post-Render call. Tidies up loose end, takes snapshots, etc.
|
|
|
|
|
2017-04-27 02:11:56 +00:00
|
|
|
renderer.postRender();
|
2018-01-16 02:08:04 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
// The final event before the step repeats. Your last chance to do anything to the canvas before it all starts again.
|
|
|
|
|
|
|
|
eventEmitter.emit('postrender', renderer, time, delta);
|
2017-05-09 00:24:46 +00:00
|
|
|
},
|
|
|
|
|
2018-02-28 21:57:32 +00:00
|
|
|
/**
|
|
|
|
* A special version of the Game Step for the HEADLESS renderer only.
|
2018-03-05 16:15:16 +00:00
|
|
|
*
|
2018-02-28 21:57:32 +00:00
|
|
|
* The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of
|
|
|
|
* Request Animation Frame, or Set Timeout on very old browsers.)
|
|
|
|
*
|
|
|
|
* The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager.
|
|
|
|
*
|
|
|
|
* This process emits `prerender` and `postrender` events, even though nothing actually displays.
|
|
|
|
*
|
|
|
|
* @method Phaser.Game#headlessStep
|
|
|
|
* @fires Phaser.Game#prerenderEvent
|
|
|
|
* @fires Phaser.Game#postrenderEvent
|
|
|
|
* @since 3.2.0
|
|
|
|
*
|
|
|
|
* @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
|
|
|
|
* @param {number} delta - The delta time elapsed since the last frame.
|
|
|
|
*/
|
|
|
|
headlessStep: function (time, delta)
|
|
|
|
{
|
2018-05-11 00:50:16 +00:00
|
|
|
var eventEmitter = this.events;
|
|
|
|
|
2018-02-28 21:57:32 +00:00
|
|
|
// Global Managers
|
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
eventEmitter.emit('prestep', time, delta);
|
2018-02-28 21:57:32 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
eventEmitter.emit('step', time, delta);
|
2018-02-28 21:57:32 +00:00
|
|
|
|
|
|
|
// Scenes
|
|
|
|
|
|
|
|
this.scene.update(time, delta);
|
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
eventEmitter.emit('poststep', time, delta);
|
|
|
|
|
2018-02-28 21:57:32 +00:00
|
|
|
// Render
|
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
eventEmitter.emit('prerender');
|
2018-02-28 21:57:32 +00:00
|
|
|
|
2018-05-11 00:50:16 +00:00
|
|
|
eventEmitter.emit('postrender');
|
2018-02-28 21:57:32 +00:00
|
|
|
},
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* Game Pause event.
|
|
|
|
*
|
|
|
|
* This event is dispatched when the game loop enters a paused state, usually as a result of the Visibility Handler.
|
|
|
|
*
|
2018-02-12 23:51:47 +00:00
|
|
|
* @event Phaser.Game#pauseEvent
|
2018-01-25 00:48:48 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called automatically by the Visibility Handler.
|
|
|
|
* This will pause the main loop and then emit a pause event.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Game#onHidden
|
|
|
|
* @protected
|
2018-02-12 23:51:47 +00:00
|
|
|
* @fires Phaser.Game#pauseEvent
|
2017-10-04 22:48:16 +00:00
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2017-05-09 00:24:46 +00:00
|
|
|
onHidden: function ()
|
|
|
|
{
|
|
|
|
this.loop.pause();
|
2017-06-28 21:19:41 +00:00
|
|
|
|
2018-01-16 02:08:04 +00:00
|
|
|
this.events.emit('pause');
|
2017-05-09 00:24:46 +00:00
|
|
|
},
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* Game Resume event.
|
|
|
|
*
|
|
|
|
* This event is dispatched when the game loop leaves a paused state and resumes running.
|
|
|
|
*
|
2018-02-12 23:51:47 +00:00
|
|
|
* @event Phaser.Game#resumeEvent
|
2018-01-25 00:48:48 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called automatically by the Visibility Handler.
|
|
|
|
* This will resume the main loop and then emit a resume event.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Game#onVisible
|
|
|
|
* @protected
|
2018-02-12 23:51:47 +00:00
|
|
|
* @fires Phaser.Game#resumeEvent
|
2017-10-04 22:48:16 +00:00
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2017-05-09 00:24:46 +00:00
|
|
|
onVisible: function ()
|
|
|
|
{
|
|
|
|
this.loop.resume();
|
2017-06-28 21:19:41 +00:00
|
|
|
|
2018-01-16 02:08:04 +00:00
|
|
|
this.events.emit('resume');
|
2017-05-09 14:39:30 +00:00
|
|
|
},
|
2017-01-25 17:10:19 +00:00
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* Called automatically by the Visibility Handler.
|
|
|
|
* This will set the main loop into a 'blurred' state, which pauses it.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Game#onBlur
|
|
|
|
* @protected
|
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2017-05-09 14:39:30 +00:00
|
|
|
onBlur: function ()
|
|
|
|
{
|
2018-05-18 16:37:45 +00:00
|
|
|
this.hasFocus = false;
|
|
|
|
|
2017-05-09 14:39:30 +00:00
|
|
|
this.loop.blur();
|
|
|
|
},
|
|
|
|
|
2017-10-04 22:48:16 +00:00
|
|
|
/**
|
2018-01-25 00:48:48 +00:00
|
|
|
* Called automatically by the Visibility Handler.
|
|
|
|
* This will set the main loop into a 'focused' state, which resumes it.
|
2017-10-04 22:48:16 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Game#onFocus
|
|
|
|
* @protected
|
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2017-05-09 14:39:30 +00:00
|
|
|
onFocus: function ()
|
|
|
|
{
|
2018-05-18 16:37:45 +00:00
|
|
|
this.hasFocus = true;
|
|
|
|
|
2017-05-09 14:39:30 +00:00
|
|
|
this.loop.focus();
|
2018-01-25 00:48:48 +00:00
|
|
|
},
|
|
|
|
|
2018-02-28 17:18:25 +00:00
|
|
|
/**
|
|
|
|
* Game Resize event.
|
|
|
|
*
|
|
|
|
* @event Phaser.Game#resizeEvent
|
|
|
|
* @param {number} width - The new width of the Game.
|
|
|
|
* @param {number} height - The new height of the Game.
|
|
|
|
*/
|
|
|
|
|
2018-02-28 14:26:24 +00:00
|
|
|
/**
|
|
|
|
* Updates the Game Config with the new width and height values given.
|
|
|
|
* Then resizes the Renderer and Input Manager scale.
|
|
|
|
*
|
|
|
|
* @method Phaser.Game#resize
|
|
|
|
* @since 3.2.0
|
2018-03-05 16:15:16 +00:00
|
|
|
*
|
2018-02-28 14:26:24 +00:00
|
|
|
* @param {number} width - The new width of the game.
|
|
|
|
* @param {number} height - The new height of the game.
|
|
|
|
*/
|
|
|
|
resize: function (width, height)
|
|
|
|
{
|
|
|
|
this.config.width = width;
|
|
|
|
this.config.height = height;
|
|
|
|
|
2018-07-18 16:22:52 +00:00
|
|
|
if (this.domContainer)
|
|
|
|
{
|
|
|
|
this.domContainer.style.width = width + 'px';
|
|
|
|
this.domContainer.style.height = height + 'px';
|
|
|
|
}
|
|
|
|
|
2018-02-28 14:26:24 +00:00
|
|
|
this.renderer.resize(width, height);
|
|
|
|
|
|
|
|
this.input.resize();
|
2018-02-28 17:18:25 +00:00
|
|
|
|
|
|
|
this.scene.resize(width, height);
|
|
|
|
|
|
|
|
this.events.emit('resize', width, height);
|
2018-02-28 14:26:24 +00:00
|
|
|
},
|
|
|
|
|
2018-01-25 00:48:48 +00:00
|
|
|
/**
|
2018-04-16 16:14:12 +00:00
|
|
|
* Flags this Game instance as needing to be destroyed on the next frame.
|
|
|
|
* It will wait until the current frame has completed and then call `runDestroy` internally.
|
2018-01-25 00:48:48 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Game#destroy
|
|
|
|
* @since 3.0.0
|
2018-04-16 16:14:12 +00:00
|
|
|
*
|
|
|
|
* @param {boolean} removeCanvas - Set to `true` if you would like the parent canvas element removed from the DOM, or `false` to leave it in place.
|
2018-01-25 00:48:48 +00:00
|
|
|
*/
|
2018-01-31 03:38:10 +00:00
|
|
|
destroy: function (removeCanvas)
|
2018-01-25 00:48:48 +00:00
|
|
|
{
|
2018-04-16 16:02:32 +00:00
|
|
|
this.pendingDestroy = true;
|
|
|
|
|
2018-04-16 16:14:12 +00:00
|
|
|
this.removeCanvas = removeCanvas;
|
2018-04-16 16:02:32 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destroys this Phaser.Game instance, all global systems, all sub-systems and all Scenes.
|
|
|
|
*
|
|
|
|
* @method Phaser.Game#runDestroy
|
|
|
|
* @private
|
|
|
|
* @since 3.5.0
|
|
|
|
*/
|
|
|
|
runDestroy: function ()
|
|
|
|
{
|
|
|
|
this.events.emit('destroy');
|
|
|
|
|
|
|
|
this.events.removeAllListeners();
|
2018-01-31 03:38:10 +00:00
|
|
|
|
|
|
|
this.scene.destroy();
|
|
|
|
|
2018-04-03 14:41:02 +00:00
|
|
|
if (this.renderer)
|
|
|
|
{
|
|
|
|
this.renderer.destroy();
|
|
|
|
}
|
2018-01-31 03:38:10 +00:00
|
|
|
|
2018-04-16 16:02:32 +00:00
|
|
|
if (this.removeCanvas && this.canvas)
|
2018-01-31 03:38:10 +00:00
|
|
|
{
|
|
|
|
CanvasPool.remove(this.canvas);
|
2018-04-19 13:23:55 +00:00
|
|
|
|
|
|
|
if (this.canvas.parentNode)
|
|
|
|
{
|
|
|
|
this.canvas.parentNode.removeChild(this.canvas);
|
|
|
|
}
|
2018-01-31 03:38:10 +00:00
|
|
|
}
|
2018-04-16 16:02:32 +00:00
|
|
|
|
2018-07-18 16:22:52 +00:00
|
|
|
if (this.domContainer)
|
|
|
|
{
|
|
|
|
this.domContainer.parentNode.removeChild(this.domContainer);
|
|
|
|
}
|
|
|
|
|
2018-04-16 16:02:32 +00:00
|
|
|
this.loop.destroy();
|
|
|
|
|
|
|
|
this.pendingDestroy = false;
|
2017-05-09 14:39:30 +00:00
|
|
|
}
|
2016-10-17 20:22:55 +00:00
|
|
|
|
2017-06-30 14:47:51 +00:00
|
|
|
});
|
2017-06-27 01:20:03 +00:00
|
|
|
|
2016-11-22 03:11:33 +00:00
|
|
|
module.exports = Game;
|