2017-08-18 00:42:14 +00:00
|
|
|
var Class = require('../../utils/Class');
|
2018-01-11 13:59:06 +00:00
|
|
|
var StableSort = require('../../utils/array/StableSort');
|
2018-01-16 02:08:22 +00:00
|
|
|
var PluginManager = require('../../plugins/PluginManager');
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-07-04 00:59:31 +00:00
|
|
|
var DisplayList = new Class({
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-06-30 14:47:51 +00:00
|
|
|
initialize:
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-07-14 13:30:20 +00:00
|
|
|
function DisplayList (scene)
|
2017-06-30 14:47:51 +00:00
|
|
|
{
|
2017-07-14 13:30:20 +00:00
|
|
|
// The Scene that owns this plugin
|
|
|
|
this.scene = scene;
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-16 02:08:22 +00:00
|
|
|
this.systems = scene.sys;
|
|
|
|
|
|
|
|
this.mapping = 'add';
|
|
|
|
|
|
|
|
this.systems.events.on('boot', this.boot, this);
|
|
|
|
|
2017-06-30 14:47:51 +00:00
|
|
|
// The objects that belong to this collection.
|
|
|
|
// The equivalent of the old `Sprite.children` array.
|
|
|
|
this.list = [];
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-11 13:59:06 +00:00
|
|
|
this.sortChildrenFlag = false;
|
|
|
|
|
2017-06-30 14:47:51 +00:00
|
|
|
this.position = 0;
|
|
|
|
},
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-16 02:08:22 +00:00
|
|
|
boot: function ()
|
|
|
|
{
|
|
|
|
this.systems.inject(this);
|
|
|
|
|
|
|
|
this.systems.events.on('shutdown', this.shutdown, this);
|
|
|
|
this.systems.events.on('destroy', this.destroy, this);
|
|
|
|
},
|
|
|
|
|
2018-01-11 13:59:06 +00:00
|
|
|
process: function ()
|
|
|
|
{
|
|
|
|
if (this.sortChildrenFlag)
|
|
|
|
{
|
|
|
|
StableSort.inplace(this.list, this.sortZ);
|
|
|
|
|
|
|
|
this.sortChildrenFlag = false;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
sortZ: function (childA, childB)
|
|
|
|
{
|
|
|
|
return childA._depth - childB._depth;
|
|
|
|
},
|
|
|
|
|
|
|
|
// Force a sort of the display list on the next call to process
|
|
|
|
queueDepthSort: function ()
|
|
|
|
{
|
|
|
|
this.sortChildrenFlag = true;
|
|
|
|
},
|
|
|
|
|
|
|
|
// Immediately sorts the display list if the flag is set
|
|
|
|
depthSort: function ()
|
|
|
|
{
|
|
|
|
if (this.sortChildrenFlag)
|
|
|
|
{
|
|
|
|
StableSort.inplace(this.list, this.sortZ);
|
|
|
|
|
|
|
|
this.sortChildrenFlag = false;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
add: function (child)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
// Is child already in this display list?
|
|
|
|
|
|
|
|
if (this.getIndex(child) === -1)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
this.list.push(child);
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
addAt: function (child, index)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
if (index === undefined) { index = 0; }
|
|
|
|
|
|
|
|
if (this.list.length === 0)
|
|
|
|
{
|
|
|
|
return this.add(child);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (index >= 0 && index <= this.list.length)
|
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
if (this.getIndex(child) === -1)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
this.list.splice(index, 0, child);
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
addMultiple: function (children)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
if (Array.isArray(children))
|
|
|
|
{
|
|
|
|
for (var i = 0; i < children.length; i++)
|
|
|
|
{
|
2017-02-22 16:37:49 +00:00
|
|
|
this.add(children[i]);
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return children;
|
|
|
|
},
|
|
|
|
|
|
|
|
getAt: function (index)
|
|
|
|
{
|
|
|
|
return this.list[index];
|
|
|
|
},
|
|
|
|
|
|
|
|
getIndex: function (child)
|
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
// Return -1 if given child isn't a child of this display list
|
2016-12-07 01:40:56 +00:00
|
|
|
return this.list.indexOf(child);
|
|
|
|
},
|
|
|
|
|
2017-07-20 11:50:38 +00:00
|
|
|
// Given an array of Game Objects, sort the array and return it,
|
|
|
|
// so that the objects are in index order with the lowest at the bottom.
|
|
|
|
sortGameObjects: function (gameObjects)
|
|
|
|
{
|
|
|
|
if (gameObjects === undefined) { gameObjects = this.list; }
|
|
|
|
|
|
|
|
this.scene.sys.depthSort();
|
|
|
|
|
|
|
|
return gameObjects.sort(this.sortIndexHandler.bind(this));
|
|
|
|
},
|
|
|
|
|
2017-07-20 12:47:12 +00:00
|
|
|
// Note that the given array is sorted in place, even though it isn't returned directly it will still be updated.
|
2017-07-20 11:50:38 +00:00
|
|
|
getTopGameObject: function (gameObjects)
|
|
|
|
{
|
|
|
|
this.sortGameObjects(gameObjects);
|
|
|
|
|
|
|
|
return gameObjects[gameObjects.length - 1];
|
|
|
|
},
|
|
|
|
|
|
|
|
// Return the child lowest down the display list (with the smallest index)
|
|
|
|
sortIndexHandler: function (childA, childB)
|
|
|
|
{
|
|
|
|
// The lower the index, the lower down the display list they are
|
|
|
|
var indexA = this.getIndex(childA);
|
|
|
|
var indexB = this.getIndex(childB);
|
|
|
|
|
|
|
|
if (indexA < indexB)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
else if (indexA > indexB)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Technically this shouldn't happen, but if the GO wasn't part of this display list then it'll
|
|
|
|
// have an index of -1, so in some cases it can
|
|
|
|
return 0;
|
|
|
|
},
|
|
|
|
|
2016-12-07 01:40:56 +00:00
|
|
|
/**
|
|
|
|
* Gets the first item from the set based on the property strictly equaling the value given.
|
|
|
|
* Returns null if not found.
|
|
|
|
*
|
|
|
|
* @method Phaser.ArraySet#getByKey
|
|
|
|
* @param {string} property - The property to check against the value.
|
|
|
|
* @param {any} value - The value to check if the property strictly equals.
|
|
|
|
* @return {any} The item that was found, or null if nothing matched.
|
|
|
|
*/
|
|
|
|
getByKey: function (property, value)
|
|
|
|
{
|
|
|
|
for (var i = 0; i < this.list.length; i++)
|
|
|
|
{
|
|
|
|
if (this.list[i][property] === value)
|
|
|
|
{
|
|
|
|
return this.list[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Searches the Group for the first instance of a child with the `name`
|
|
|
|
* property matching the given argument. Should more than one child have
|
|
|
|
* the same name only the first instance is returned.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#getByName
|
|
|
|
* @param {string} name - The name to search for.
|
|
|
|
* @return {any} The first child with a matching name, or null if none were found.
|
|
|
|
*/
|
|
|
|
getByName: function (name)
|
|
|
|
{
|
|
|
|
return this.getByKey('name', name);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a random child from the group.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#getRandom
|
|
|
|
* @param {integer} [startIndex=0] - Offset from the front of the group (lowest child).
|
|
|
|
* @param {integer} [length=(to top)] - Restriction on the number of values you want to randomly select from.
|
|
|
|
* @return {any} A random child of this Group.
|
|
|
|
*/
|
|
|
|
getRandom: function (startIndex, length)
|
|
|
|
{
|
|
|
|
if (startIndex === undefined) { startIndex = 0; }
|
|
|
|
if (length === undefined) { length = this.list.length; }
|
|
|
|
|
|
|
|
if (length === 0 || length > this.list.length)
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
var randomIndex = startIndex + Math.floor(Math.random() * length);
|
|
|
|
|
|
|
|
return this.list[randomIndex];
|
|
|
|
},
|
|
|
|
|
2017-02-02 16:55:02 +00:00
|
|
|
getFirst: function (property, value, startIndex, endIndex)
|
|
|
|
{
|
|
|
|
if (startIndex === undefined) { startIndex = 0; }
|
|
|
|
if (endIndex === undefined) { endIndex = this.list.length; }
|
|
|
|
|
|
|
|
for (var i = startIndex; i < endIndex; i++)
|
|
|
|
{
|
|
|
|
var child = this.list[i];
|
|
|
|
|
|
|
|
if (child[property] === value)
|
|
|
|
{
|
|
|
|
return child;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
|
2016-12-07 01:40:56 +00:00
|
|
|
/**
|
|
|
|
* Returns all children in this Group.
|
|
|
|
*
|
|
|
|
* You can optionally specify a matching criteria using the `property` and `value` arguments.
|
|
|
|
*
|
|
|
|
* For example: `getAll('exists', true)` would return only children that have their exists property set.
|
|
|
|
*
|
|
|
|
* Optionally you can specify a start and end index. For example if this Group had 100 children,
|
|
|
|
* and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
|
|
|
|
* the first 50 children in the Group.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#getAll
|
|
|
|
* @param {string} [property] - An optional property to test against the value argument.
|
|
|
|
* @param {any} [value] - If property is set then Child.property must strictly equal this value to be included in the results.
|
|
|
|
* @param {integer} [startIndex=0] - The first child index to start the search from.
|
|
|
|
* @param {integer} [endIndex] - The last child index to search up until.
|
|
|
|
* @return {any} A random existing child of this Group.
|
|
|
|
*/
|
|
|
|
getAll: function (property, value, startIndex, endIndex)
|
|
|
|
{
|
|
|
|
if (startIndex === undefined) { startIndex = 0; }
|
|
|
|
if (endIndex === undefined) { endIndex = this.list.length; }
|
|
|
|
|
|
|
|
var output = [];
|
|
|
|
|
|
|
|
for (var i = startIndex; i < endIndex; i++)
|
|
|
|
{
|
|
|
|
var child = this.list[i];
|
|
|
|
|
|
|
|
if (property)
|
|
|
|
{
|
|
|
|
if (child[property] === value)
|
|
|
|
{
|
|
|
|
output.push(child);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
output.push(child);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return output;
|
|
|
|
},
|
|
|
|
|
|
|
|
swap: function (child1, child2)
|
|
|
|
{
|
|
|
|
if (child1 === child2)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var index1 = this.getIndex(child1);
|
|
|
|
var index2 = this.getIndex(child2);
|
|
|
|
|
|
|
|
if (index1 < 0 || index2 < 0)
|
|
|
|
{
|
2017-07-04 00:59:31 +00:00
|
|
|
throw new Error('DisplayList.swap: Supplied objects must be children of the same list');
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
this.list[index1] = child2;
|
|
|
|
this.list[index2] = child1;
|
|
|
|
},
|
|
|
|
|
|
|
|
// was setIndex
|
|
|
|
moveTo: function (child, index)
|
|
|
|
{
|
|
|
|
var currentIndex = this.getIndex(child);
|
|
|
|
|
|
|
|
if (currentIndex === -1 || index < 0 || index >= this.list.length)
|
|
|
|
{
|
2017-07-04 00:59:31 +00:00
|
|
|
throw new Error('DisplayList.moveTo: The supplied index is out of bounds');
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Remove
|
|
|
|
this.list.splice(currentIndex, 1);
|
|
|
|
|
|
|
|
// Add in new location
|
|
|
|
this.list.splice(index, 0, child);
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
remove: function (child)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
var index = this.list.indexOf(child);
|
|
|
|
|
|
|
|
if (index !== -1)
|
|
|
|
{
|
|
|
|
this.list.splice(index, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
removeAt: function (index)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
var child = this.list[index];
|
|
|
|
|
|
|
|
if (child)
|
|
|
|
{
|
|
|
|
this.children.splice(index, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
|
|
|
removeBetween: function (beginIndex, endIndex)
|
|
|
|
{
|
|
|
|
if (beginIndex === undefined) { beginIndex = 0; }
|
|
|
|
if (endIndex === undefined) { endIndex = this.list.length; }
|
|
|
|
|
|
|
|
var range = endIndex - beginIndex;
|
|
|
|
|
|
|
|
if (range > 0 && range <= endIndex)
|
|
|
|
{
|
|
|
|
var removed = this.list.splice(beginIndex, range);
|
|
|
|
|
|
|
|
return removed;
|
|
|
|
}
|
|
|
|
else if (range === 0 && this.list.length === 0)
|
|
|
|
{
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-07-04 00:59:31 +00:00
|
|
|
throw new Error('DisplayList.removeBetween: Range Error, numeric values are outside the acceptable range');
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes all the items.
|
|
|
|
*
|
|
|
|
* @method Phaser.ArraySet#removeAll
|
|
|
|
*/
|
|
|
|
removeAll: function ()
|
|
|
|
{
|
|
|
|
var i = this.list.length;
|
|
|
|
|
|
|
|
while (i--)
|
|
|
|
{
|
|
|
|
this.remove(this.list[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Brings the given child to the top of this group so it renders above all other children.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#bringToTop
|
|
|
|
* @param {any} child - The child to bring to the top of this group.
|
|
|
|
* @return {any} The child that was moved.
|
|
|
|
*/
|
|
|
|
bringToTop: function (child)
|
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
if (this.getIndex(child) < this.list.length)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
this.remove(child);
|
|
|
|
this.add(child);
|
|
|
|
}
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends the given child to the bottom of this group so it renders below all other children.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#sendToBack
|
|
|
|
* @param {any} child - The child to send to the bottom of this group.
|
|
|
|
* @return {any} The child that was moved.
|
|
|
|
*/
|
|
|
|
sendToBack: function (child)
|
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
if (this.getIndex(child) > 0)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
this.remove(child);
|
|
|
|
this.addAt(child, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Moves the given child up one place in this group unless it's already at the top.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#moveUp
|
|
|
|
* @param {any} child - The child to move up in the group.
|
|
|
|
* @return {any} The child that was moved.
|
|
|
|
*/
|
|
|
|
moveUp: function (child)
|
|
|
|
{
|
|
|
|
var a = this.getIndex(child);
|
|
|
|
|
|
|
|
if (a !== -1 && a < this.list.length - 1)
|
|
|
|
{
|
|
|
|
var b = this.getAt(a + 1);
|
|
|
|
|
|
|
|
if (b)
|
|
|
|
{
|
|
|
|
this.swap(child, b);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Moves the given child down one place in this group unless it's already at the bottom.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#moveDown
|
|
|
|
* @param {any} child - The child to move down in the group.
|
|
|
|
* @return {any} The child that was moved.
|
|
|
|
*/
|
|
|
|
moveDown: function (child)
|
|
|
|
{
|
|
|
|
var a = this.getIndex(child);
|
|
|
|
|
|
|
|
if (a > 0)
|
|
|
|
{
|
|
|
|
var b = this.getAt(a - 1);
|
|
|
|
|
|
|
|
if (b)
|
|
|
|
{
|
|
|
|
this.swap(child, b);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return child;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reverses all children in this group.
|
|
|
|
*
|
|
|
|
* This operation applies only to immediate children and does not propagate to subgroups.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#reverse
|
|
|
|
*/
|
|
|
|
reverse: function ()
|
|
|
|
{
|
|
|
|
this.list.reverse();
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
shuffle: function ()
|
|
|
|
{
|
|
|
|
for (var i = this.list.length - 1; i > 0; i--)
|
|
|
|
{
|
|
|
|
var j = Math.floor(Math.random() * (i + 1));
|
|
|
|
var temp = this.list[i];
|
|
|
|
this.list[i] = this.list[j];
|
|
|
|
this.list[j] = temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Replaces a child of this Group with the given newChild. The newChild cannot be a member of this Group.
|
|
|
|
*
|
|
|
|
* If `Group.enableBody` is set, then a physics body will be created on the object, so long as one does not already exist.
|
|
|
|
*
|
|
|
|
* If `Group.inputEnableChildren` is set, then an Input Handler will be created on the object, so long as one does not already exist.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#replace
|
|
|
|
* @param {any} oldChild - The child in this group that will be replaced.
|
|
|
|
* @param {any} newChild - The child to be inserted into this group.
|
|
|
|
* @return {any} Returns the oldChild that was replaced within this group.
|
|
|
|
*/
|
2017-02-22 16:37:49 +00:00
|
|
|
replace: function (oldChild, newChild)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
var index = this.getIndex(oldChild);
|
|
|
|
|
|
|
|
if (index !== -1)
|
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
newChild.scene.sys.displayList.remove(newChild);
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
this.remove(oldChild);
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
this.addAt(newChild, index);
|
2016-12-07 01:40:56 +00:00
|
|
|
|
|
|
|
return oldChild;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
// Swaps a child from another parent, with one from this parent.
|
|
|
|
// child1 = the child of THIS parent
|
|
|
|
// child2 = the child of the OTHER parent
|
2017-02-22 16:37:49 +00:00
|
|
|
exchange: function (child1, child2)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
2017-09-01 18:47:26 +00:00
|
|
|
if (child1 === child2 || child1.scene === child2.scene)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-09-01 18:47:26 +00:00
|
|
|
var child2Parent = child2.scene.sys.displayList;
|
2016-12-07 01:40:56 +00:00
|
|
|
|
|
|
|
var index1 = this.getIndex(child1);
|
2017-09-01 18:47:26 +00:00
|
|
|
var index2 = child2Parent.getIndex(child2);
|
2016-12-07 01:40:56 +00:00
|
|
|
|
|
|
|
if (index1 < 0 || index2 < 0)
|
|
|
|
{
|
|
|
|
throw new Error('Children.swap: Supplied objects must be children of parents');
|
|
|
|
}
|
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
this.remove(child1);
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-09-01 18:47:26 +00:00
|
|
|
child2Parent.remove(child2);
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-02-22 16:37:49 +00:00
|
|
|
this.addAt(child2, index1);
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-09-01 18:47:26 +00:00
|
|
|
child2Parent.addAt(child1, index2);
|
2016-12-07 01:40:56 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks for the item within this list.
|
|
|
|
*
|
|
|
|
* @method Phaser.ArraySet#exists
|
|
|
|
* @param {any} item - The element to get the list index for.
|
|
|
|
* @return {boolean} True if the item is found in the list, otherwise false.
|
|
|
|
*/
|
|
|
|
exists: function (child)
|
|
|
|
{
|
|
|
|
return (this.list.indexOf(child) > -1);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the property `key` to the given value on all members of this list.
|
|
|
|
*
|
|
|
|
* @method Phaser.ArraySet#setAll
|
|
|
|
* @param {any} key - The property of the item to set.
|
|
|
|
* @param {any} value - The value to set the property to.
|
|
|
|
*/
|
|
|
|
setAll: function (key, value)
|
|
|
|
{
|
|
|
|
for (var i = 0; i < this.list.length; i++)
|
|
|
|
{
|
|
|
|
if (this.list[i])
|
|
|
|
{
|
|
|
|
this.list[i][key] = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Passes all children to the given callback.
|
|
|
|
*
|
|
|
|
* @method each
|
|
|
|
* @param {function} callback - The function to call.
|
|
|
|
* @param {object} [thisArg] - Value to use as `this` when executing callback.
|
|
|
|
* @param {...*} [arguments] - Additional arguments that will be passed to the callback, after the child.
|
|
|
|
*/
|
|
|
|
each: function (callback, thisArg)
|
|
|
|
{
|
|
|
|
var args = [ null ];
|
|
|
|
|
|
|
|
for (var i = 1; i < arguments.length; i++)
|
|
|
|
{
|
|
|
|
args.push(arguments[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < this.list.length; i++)
|
|
|
|
{
|
|
|
|
args[0] = this.list[i];
|
|
|
|
callback.apply(thisArg, args);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Moves all children from this Group to the Group given.
|
|
|
|
*
|
|
|
|
* @method Phaser.Group#moveAll
|
|
|
|
* @param {Phaser.Group} group - The new Group to which the children will be moved to.
|
|
|
|
* @param {boolean} [silent=false] - If true the children will not dispatch the `onAddedToGroup` event for the new Group.
|
|
|
|
* @return {Phaser.Group} The Group to which all the children were moved.
|
|
|
|
*/
|
|
|
|
reparent: function (newParent)
|
|
|
|
{
|
2017-07-14 13:30:20 +00:00
|
|
|
if (newParent !== this.scene)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
for (var i = 0; i < this.list.length; i++)
|
|
|
|
{
|
|
|
|
var child = this.remove(this.list[i]);
|
|
|
|
|
2017-09-01 18:47:26 +00:00
|
|
|
newParent.sys.displayList.add(child);
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return newParent;
|
2017-06-30 14:47:51 +00:00
|
|
|
},
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-16 02:08:22 +00:00
|
|
|
shutdown: function ()
|
|
|
|
{
|
|
|
|
this.removeAll();
|
|
|
|
},
|
|
|
|
|
|
|
|
destroy: function ()
|
|
|
|
{
|
|
|
|
this.shutdown();
|
|
|
|
},
|
|
|
|
|
2016-12-07 01:40:56 +00:00
|
|
|
length: {
|
|
|
|
|
|
|
|
get: function ()
|
|
|
|
{
|
|
|
|
return this.list.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
first: {
|
|
|
|
|
|
|
|
get: function ()
|
|
|
|
{
|
|
|
|
this.position = 0;
|
|
|
|
|
|
|
|
if (this.list.length > 0)
|
|
|
|
{
|
|
|
|
return this.list[0];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
last: {
|
|
|
|
|
|
|
|
get: function ()
|
|
|
|
{
|
|
|
|
if (this.list.length > 0)
|
|
|
|
{
|
|
|
|
this.position = this.list.length - 1;
|
|
|
|
|
|
|
|
return this.list[this.position];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
next: {
|
|
|
|
|
|
|
|
get: function ()
|
|
|
|
{
|
|
|
|
if (this.position < this.list.length)
|
|
|
|
{
|
|
|
|
this.position++;
|
|
|
|
|
|
|
|
return this.list[this.position];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
previous: {
|
|
|
|
|
|
|
|
get: function ()
|
|
|
|
{
|
|
|
|
if (this.position > 0)
|
|
|
|
{
|
|
|
|
this.position--;
|
|
|
|
|
|
|
|
return this.list[this.position];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2018-01-16 02:08:22 +00:00
|
|
|
PluginManager.register('displayList', DisplayList);
|
|
|
|
|
2017-07-04 00:59:31 +00:00
|
|
|
module.exports = DisplayList;
|