2017-02-23 03:10:48 +00:00
|
|
|
var Class = require('../utils/Class');
|
2017-07-04 00:59:31 +00:00
|
|
|
var Components = require('./components');
|
2018-01-30 00:55:27 +00:00
|
|
|
var DataManager = require('../data/DataManager');
|
2018-01-12 17:09:09 +00:00
|
|
|
var EventEmitter = require('eventemitter3');
|
2016-12-07 02:28:22 +00:00
|
|
|
|
2017-02-23 03:10:48 +00:00
|
|
|
var GameObject = new Class({
|
2016-12-07 02:28:22 +00:00
|
|
|
|
2018-01-12 17:09:09 +00:00
|
|
|
Extends: EventEmitter,
|
|
|
|
|
2017-02-23 03:10:48 +00:00
|
|
|
initialize:
|
2016-12-07 02:28:22 +00:00
|
|
|
|
2017-09-12 23:58:25 +00:00
|
|
|
/**
|
|
|
|
* The base class that all Game Objects extend.
|
|
|
|
* You don't create GameObjects directly and they cannot be added to the display list.
|
|
|
|
* Instead, use them as the base for your own custom classes.
|
|
|
|
*
|
|
|
|
* @class GameObject
|
2017-10-04 16:05:26 +00:00
|
|
|
* @memberof Phaser.GameObjects
|
2017-09-12 23:58:25 +00:00
|
|
|
* @constructor
|
|
|
|
*
|
|
|
|
* @param {Phaser.Scene} scene - The Scene to which this Game Object belongs.
|
|
|
|
* @param {string} type - A textual representation of the type of Game Object, i.e. `sprite`.
|
|
|
|
*/
|
2017-07-14 13:30:20 +00:00
|
|
|
function GameObject (scene, type)
|
2017-02-23 03:10:48 +00:00
|
|
|
{
|
2018-01-12 17:09:09 +00:00
|
|
|
EventEmitter.call(this);
|
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
|
|
|
* The Scene to which this Game Object belongs.
|
2017-09-12 23:58:25 +00:00
|
|
|
* Game Objects can only belong to one Scene.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @property {Phaser.Scene} scene
|
2017-09-13 01:02:49 +00:00
|
|
|
* @protected
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-07-14 13:30:20 +00:00
|
|
|
this.scene = scene;
|
2016-12-07 02:28:22 +00:00
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
2017-09-12 23:58:25 +00:00
|
|
|
* A textual representation of this Game Object, i.e. `sprite`.
|
|
|
|
* Used internally by Phaser but is available for your own custom classes to populate.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @property {string} type
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-04-12 23:05:12 +00:00
|
|
|
this.type = type;
|
2017-07-04 00:59:31 +00:00
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
2017-09-12 23:58:25 +00:00
|
|
|
* The name of this Game Object.
|
|
|
|
* Empty by default and never populated by Phaser, this is left for developers to use.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @property {string} [name='']
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-02-23 03:10:48 +00:00
|
|
|
this.name = '';
|
2017-07-04 00:59:31 +00:00
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
2017-09-12 23:58:25 +00:00
|
|
|
* The active state of this Game Object.
|
|
|
|
* A Game Object with an active state of `true` is processed by the Scenes UpdateList, if added to it.
|
2017-09-13 01:02:49 +00:00
|
|
|
* An active object is one which is having its logic and internal systems updated.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @property {boolean} [active=true]
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-07-07 00:56:02 +00:00
|
|
|
this.active = true;
|
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
2017-09-12 23:58:25 +00:00
|
|
|
* The Tab Index of the Game Object.
|
|
|
|
* Reserved for future use by plugins and the Input Manager.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @property {integer} [tabIndex=-1]
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-05-01 00:27:35 +00:00
|
|
|
this.tabIndex = -1;
|
2016-12-07 02:28:22 +00:00
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
2018-01-30 00:55:27 +00:00
|
|
|
* A Data Manager.
|
2017-09-12 23:58:25 +00:00
|
|
|
* It allows you to store, query and get key/value paired information specific to this Game Object.
|
2018-01-30 00:55:27 +00:00
|
|
|
* `null` by default. Automatically created if you use `getData` or `setData` or `setDataEnabled`.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2018-01-30 00:55:27 +00:00
|
|
|
* @property {Phaser.Data.DataManager} data
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2018-01-30 00:55:27 +00:00
|
|
|
this.data = null;
|
2017-09-08 00:59:53 +00:00
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
2017-09-13 01:02:49 +00:00
|
|
|
* The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not.
|
|
|
|
* The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively.
|
|
|
|
* If those components are not used by your custom class then you can use this bitmask as you wish.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @property {integer} [renderFlags=15]
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-02-23 03:10:48 +00:00
|
|
|
this.renderFlags = 15;
|
2017-09-11 23:28:53 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* A bitmask that controls if this Game Object is drawn by a Camera or not.
|
2017-09-13 01:02:49 +00:00
|
|
|
* Not usually set directly. Instead call `Camera.ignore`.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @property {number} [cameraFilter=0]
|
2017-09-13 01:02:49 +00:00
|
|
|
* @see Phaser.Cameras.Camera.ignore
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-08-15 19:42:04 +00:00
|
|
|
this.cameraFilter = 0;
|
2017-07-07 17:12:57 +00:00
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
2017-09-13 01:02:49 +00:00
|
|
|
* If this Game Object is enabled for input then this property will contain an InteractiveObject instance.
|
|
|
|
* Not usually set directly. Instead call `GameObject.setInteractive()`.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-10-04 16:05:26 +00:00
|
|
|
* @property {?Phaser.Input.InteractiveObject} [input=null]
|
2017-09-13 01:02:49 +00:00
|
|
|
* @see setInteractive
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-07-18 12:53:34 +00:00
|
|
|
this.input = null;
|
2017-07-13 01:05:32 +00:00
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
|
|
|
* If this Game Object is enabled for physics then this property will contain a reference to a Physics Body.
|
|
|
|
*
|
2017-10-04 16:05:26 +00:00
|
|
|
* @property {?Phaser.Physics.Body} [body=null]
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-08-15 22:35:16 +00:00
|
|
|
this.body = null;
|
|
|
|
|
2017-09-12 16:08:43 +00:00
|
|
|
// Tell the Scene to re-sort the children
|
2018-01-11 13:59:06 +00:00
|
|
|
this.scene.sys.queueDepthSort();
|
2017-02-23 03:10:48 +00:00
|
|
|
},
|
2016-12-07 02:28:22 +00:00
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
|
|
|
* Sets the `active` property of this Game Object and returns this Game Object for further chaining.
|
2017-09-13 01:02:49 +00:00
|
|
|
* A Game Object with its `active` property set to `true` will be updated by the Scenes UpdateList.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @method setActive
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @param {boolean} value - True if this Game Object should be set as active, false if not.
|
2017-09-12 16:08:43 +00:00
|
|
|
* @return {GameObject} This GameObject.
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-07-07 00:56:02 +00:00
|
|
|
setActive: function (value)
|
|
|
|
{
|
|
|
|
this.active = value;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
|
|
|
* Sets the `name` property of this Game Object and returns this Game Object for further chaining.
|
2017-09-13 01:02:49 +00:00
|
|
|
* The `name` property is not populated by Phaser and is presented for your own use.
|
|
|
|
*
|
|
|
|
* @example game objects/image/set name.js
|
|
|
|
* @tutorial game objects/basics
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @method setName
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @param {string} value - The name to be given to this Game Object.
|
2017-09-12 16:08:43 +00:00
|
|
|
* @return {GameObject} This GameObject.
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-07-27 16:39:46 +00:00
|
|
|
setName: function (value)
|
2017-07-07 17:26:03 +00:00
|
|
|
{
|
2017-07-27 16:39:46 +00:00
|
|
|
this.name = value;
|
|
|
|
|
|
|
|
return this;
|
2017-07-07 17:26:03 +00:00
|
|
|
},
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
setDataEnabled: function ()
|
2017-12-15 04:08:05 +00:00
|
|
|
{
|
2018-01-30 00:55:27 +00:00
|
|
|
if (!this.data)
|
2017-12-15 04:08:05 +00:00
|
|
|
{
|
2018-01-30 00:55:27 +00:00
|
|
|
this.data = new DataManager(this);
|
2017-12-15 04:08:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
2017-09-29 10:41:10 +00:00
|
|
|
/**
|
|
|
|
* This is a quick chainable alias to the `DataProxy.set` method.
|
|
|
|
* It allows you to set a key and value in this Game Objects data store.
|
|
|
|
*
|
|
|
|
* @method setData
|
|
|
|
*
|
|
|
|
* @param {string} key - The key of the property to be stored.
|
|
|
|
* @param {any} value - The value to store with the key. Can be a string, number, array or object.
|
|
|
|
* @return {GameObject} This GameObject.
|
|
|
|
*/
|
|
|
|
setData: function (key, value)
|
|
|
|
{
|
2018-01-30 00:55:27 +00:00
|
|
|
if (!this.data)
|
|
|
|
{
|
|
|
|
this.data = new DataManager(this);
|
|
|
|
}
|
|
|
|
|
2017-09-29 10:41:10 +00:00
|
|
|
this.data.set(key, value);
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is a quick alias to the `DataProxy.get` method to remain consistent with `setData`.
|
|
|
|
*
|
|
|
|
* @method getData
|
|
|
|
*
|
|
|
|
* @param {string} key - The key of the property to be retrieve.
|
|
|
|
* @return {any} The data, if present in the Data Store.
|
|
|
|
*/
|
|
|
|
getData: function (key)
|
|
|
|
{
|
2018-01-30 00:55:27 +00:00
|
|
|
if (!this.data)
|
|
|
|
{
|
|
|
|
this.data = new DataManager(this);
|
|
|
|
}
|
|
|
|
|
2017-09-29 10:41:10 +00:00
|
|
|
return this.data.get(key);
|
|
|
|
},
|
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
|
|
|
* Pass this Game Object to the Input Manager to enable it for Input.
|
|
|
|
*
|
2017-09-13 01:02:49 +00:00
|
|
|
* @example game objects/image/set interactive.js
|
|
|
|
* @tutorial input/basics
|
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @method setInteractive
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @param {any} [shape] - A geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used.
|
|
|
|
* @param {function} [callback] - A callback to be invoked when the Game Object is interacted with.
|
2017-09-12 16:08:43 +00:00
|
|
|
* @return {GameObject} This GameObject.
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-07-18 12:53:34 +00:00
|
|
|
setInteractive: function (shape, callback)
|
2017-07-13 01:05:32 +00:00
|
|
|
{
|
2018-01-16 23:50:01 +00:00
|
|
|
this.scene.sys.input.enable(this, shape, callback);
|
2017-07-13 01:05:32 +00:00
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
2017-07-27 16:39:46 +00:00
|
|
|
// To be overridden by custom GameObjects. Allows base objects to be used in a Pool.
|
|
|
|
update: function ()
|
|
|
|
{
|
|
|
|
},
|
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
|
|
|
* Returns a JSON representation of the Game Object.
|
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @method toJSON
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @return {object} A JSON representation of the Game Object.
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-04-12 23:35:27 +00:00
|
|
|
toJSON: function ()
|
|
|
|
{
|
|
|
|
return Components.ToJSON(this);
|
|
|
|
},
|
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
|
|
|
* Compares the renderMask with the renderFlags to see if this Game Object will render or not.
|
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @method willRender
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @return {boolean} True if the Game Object should be rendered, otherwise false.
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2017-07-27 13:22:05 +00:00
|
|
|
willRender: function ()
|
|
|
|
{
|
2017-09-12 23:58:25 +00:00
|
|
|
return (GameObject.RENDER_MASK === this.renderFlags);
|
2017-07-27 13:22:05 +00:00
|
|
|
},
|
|
|
|
|
2017-09-11 23:28:53 +00:00
|
|
|
/**
|
2017-09-13 01:02:49 +00:00
|
|
|
* Destroys this Game Object removing it from the Display List and Update List and
|
|
|
|
* severing all ties to parent resources.
|
|
|
|
*
|
|
|
|
* Also removes itself from the Input Manager and Physics Manager if previously enabled.
|
|
|
|
*
|
|
|
|
* Use this to remove a Game Object from your game if you don't ever plan to use it again.
|
|
|
|
* As long as no reference to it exists within your own code it should become free for
|
|
|
|
* garbage collection by the browser.
|
|
|
|
*
|
|
|
|
* If you just want to temporarily disable an object then look at using the
|
|
|
|
* Game Object Pool instead of destroying it, as destroyed objects cannot be resurrected.
|
2017-09-11 23:28:53 +00:00
|
|
|
*
|
2017-09-12 23:58:25 +00:00
|
|
|
* @method destroy
|
2017-09-11 23:28:53 +00:00
|
|
|
*/
|
2016-12-07 02:28:22 +00:00
|
|
|
destroy: function ()
|
|
|
|
{
|
2017-11-30 01:20:22 +00:00
|
|
|
if (this.preDestroy)
|
|
|
|
{
|
2017-12-02 04:03:06 +00:00
|
|
|
this.preDestroy.call(this);
|
2017-11-30 01:20:22 +00:00
|
|
|
}
|
|
|
|
|
2018-01-17 00:29:23 +00:00
|
|
|
var sys = this.scene.sys;
|
|
|
|
|
|
|
|
sys.displayList.remove(this);
|
|
|
|
sys.updateList.remove(this);
|
2017-03-30 12:28:40 +00:00
|
|
|
|
2017-07-28 00:17:18 +00:00
|
|
|
if (this.input)
|
|
|
|
{
|
2018-01-17 00:29:23 +00:00
|
|
|
sys.input.clear(this);
|
2017-09-25 15:06:16 +00:00
|
|
|
this.input = undefined;
|
2017-07-28 00:17:18 +00:00
|
|
|
}
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
if (this.data)
|
|
|
|
{
|
|
|
|
this.data.destroy();
|
|
|
|
|
|
|
|
this.data = undefined;
|
|
|
|
}
|
|
|
|
|
2018-01-12 17:09:09 +00:00
|
|
|
// TODO Keep a reference to the manager in Body, so body can remove itself, not via System
|
2017-08-15 22:35:16 +00:00
|
|
|
if (this.body)
|
|
|
|
{
|
2018-01-25 23:19:37 +00:00
|
|
|
// sys.physicsManager.remove(this);
|
2017-12-02 04:03:06 +00:00
|
|
|
|
2017-09-25 15:06:16 +00:00
|
|
|
this.body = undefined;
|
2017-08-15 22:35:16 +00:00
|
|
|
}
|
|
|
|
|
2017-12-02 04:03:06 +00:00
|
|
|
// Tell the Scene to re-sort the children
|
2018-01-17 00:29:23 +00:00
|
|
|
sys.queueDepthSort();
|
2017-12-02 04:03:06 +00:00
|
|
|
|
2017-08-07 16:14:13 +00:00
|
|
|
this.active = false;
|
2017-12-15 04:08:05 +00:00
|
|
|
this.visible = false;
|
2017-08-07 16:14:13 +00:00
|
|
|
|
2017-07-14 13:30:20 +00:00
|
|
|
this.scene = undefined;
|
2018-01-12 17:09:09 +00:00
|
|
|
|
|
|
|
this.removeAllListeners();
|
2016-12-07 02:28:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2017-09-12 23:58:25 +00:00
|
|
|
/**
|
|
|
|
* The bitmask that `GameObject.renderFlags` is compared against to determine if the Game Object will render or not.
|
|
|
|
*
|
2017-09-13 01:02:49 +00:00
|
|
|
* @constant {integer} RENDER_MASK
|
|
|
|
* @default
|
2017-09-12 23:58:25 +00:00
|
|
|
*/
|
|
|
|
GameObject.RENDER_MASK = 15;
|
|
|
|
|
2016-12-07 02:28:22 +00:00
|
|
|
module.exports = GameObject;
|