mirror of
https://github.com/photonstorm/phaser
synced 2024-12-24 20:13:35 +00:00
232 lines
No EOL
6.1 KiB
JavaScript
232 lines
No EOL
6.1 KiB
JavaScript
/* jshint noarg: false */
|
|
|
|
/**
|
|
* @author Georgios Kaleadis https://github.com/georgiee
|
|
* @author Richard Davey <rich@photonstorm.com>
|
|
* @copyright 2016 Photon Storm Ltd.
|
|
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
|
*/
|
|
|
|
/**
|
|
* Allow to access a list of created fixture (coming from Body#addPhaserPolygon)
|
|
* which itself parse the input from PhysicsEditor with the custom phaser exporter.
|
|
* You can access fixtures of a Body by a group index or even by providing a fixture Key.
|
|
|
|
* You can set the fixture key and also the group index for a fixture in PhysicsEditor.
|
|
* This gives you the power to create a complex body built of many fixtures and modify them
|
|
* during runtime (to remove parts, set masks, categories & sensor properties)
|
|
*
|
|
* @class Phaser.Physics.P2.FixtureList
|
|
* @constructor
|
|
* @param {Array} list - A list of fixtures (from Phaser.Physics.P2.Body#addPhaserPolygon)
|
|
*/
|
|
Phaser.Physics.P2.FixtureList = function (list) {
|
|
|
|
if (!Array.isArray(list))
|
|
{
|
|
list = [list];
|
|
}
|
|
|
|
this.rawList = list;
|
|
this.init();
|
|
this.parse(this.rawList);
|
|
|
|
};
|
|
|
|
Phaser.Physics.P2.FixtureList.prototype = {
|
|
|
|
/**
|
|
* @method Phaser.Physics.P2.FixtureList#init
|
|
*/
|
|
init: function () {
|
|
|
|
/**
|
|
* @property {object} namedFixtures - Collect all fixtures with a key
|
|
* @private
|
|
*/
|
|
this.namedFixtures = {};
|
|
|
|
/**
|
|
* @property {Array} groupedFixtures - Collect all given fixtures per group index. Notice: Every fixture with a key also belongs to a group
|
|
* @private
|
|
*/
|
|
this.groupedFixtures = [];
|
|
|
|
/**
|
|
* @property {Array} allFixtures - This is a list of everything in this collection
|
|
* @private
|
|
*/
|
|
this.allFixtures = [];
|
|
|
|
},
|
|
|
|
/**
|
|
* @method Phaser.Physics.P2.FixtureList#setCategory
|
|
* @param {number} bit - The bit to set as the collision group.
|
|
* @param {string} fixtureKey - Only apply to the fixture with the given key.
|
|
*/
|
|
setCategory: function (bit, fixtureKey) {
|
|
|
|
var setter = function(fixture) {
|
|
fixture.collisionGroup = bit;
|
|
};
|
|
|
|
this.getFixtures(fixtureKey).forEach(setter);
|
|
|
|
},
|
|
|
|
/**
|
|
* @method Phaser.Physics.P2.FixtureList#setMask
|
|
* @param {number} bit - The bit to set as the collision mask
|
|
* @param {string} fixtureKey - Only apply to the fixture with the given key
|
|
*/
|
|
setMask: function (bit, fixtureKey) {
|
|
|
|
var setter = function(fixture) {
|
|
fixture.collisionMask = bit;
|
|
};
|
|
|
|
this.getFixtures(fixtureKey).forEach(setter);
|
|
|
|
},
|
|
|
|
/**
|
|
* @method Phaser.Physics.P2.FixtureList#setSensor
|
|
* @param {boolean} value - sensor true or false
|
|
* @param {string} fixtureKey - Only apply to the fixture with the given key
|
|
*/
|
|
setSensor: function (value, fixtureKey) {
|
|
|
|
var setter = function(fixture) {
|
|
fixture.sensor = value;
|
|
};
|
|
|
|
this.getFixtures(fixtureKey).forEach(setter);
|
|
|
|
},
|
|
|
|
/**
|
|
* @method Phaser.Physics.P2.FixtureList#setMaterial
|
|
* @param {Object} material - The contact material for a fixture
|
|
* @param {string} fixtureKey - Only apply to the fixture with the given key
|
|
*/
|
|
setMaterial: function (material, fixtureKey) {
|
|
|
|
var setter = function(fixture) {
|
|
fixture.material = material;
|
|
};
|
|
|
|
this.getFixtures(fixtureKey).forEach(setter);
|
|
|
|
},
|
|
|
|
/**
|
|
* Accessor to get either a list of specified fixtures by key or the whole fixture list
|
|
*
|
|
* @method Phaser.Physics.P2.FixtureList#getFixtures
|
|
* @param {array} keys - A list of fixture keys
|
|
*/
|
|
getFixtures: function (keys) {
|
|
|
|
var fixtures = [];
|
|
|
|
if (keys)
|
|
{
|
|
if (!(keys instanceof Array))
|
|
{
|
|
keys = [keys];
|
|
}
|
|
|
|
var self = this;
|
|
keys.forEach(function(key) {
|
|
if (self.namedFixtures[key])
|
|
{
|
|
fixtures.push(self.namedFixtures[key]);
|
|
}
|
|
});
|
|
|
|
return this.flatten(fixtures);
|
|
|
|
}
|
|
else
|
|
{
|
|
return this.allFixtures;
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
* Accessor to get either a single fixture by its key.
|
|
*
|
|
* @method Phaser.Physics.P2.FixtureList#getFixtureByKey
|
|
* @param {string} key - The key of the fixture.
|
|
*/
|
|
getFixtureByKey: function (key) {
|
|
|
|
return this.namedFixtures[key];
|
|
|
|
},
|
|
|
|
/**
|
|
* Accessor to get a group of fixtures by its group index.
|
|
*
|
|
* @method Phaser.Physics.P2.FixtureList#getGroup
|
|
* @param {number} groupID - The group index.
|
|
*/
|
|
getGroup: function (groupID) {
|
|
|
|
return this.groupedFixtures[groupID];
|
|
|
|
},
|
|
|
|
/**
|
|
* Parser for the output of Phaser.Physics.P2.Body#addPhaserPolygon
|
|
*
|
|
* @method Phaser.Physics.P2.FixtureList#parse
|
|
*/
|
|
parse: function () {
|
|
|
|
var key, value, _ref, _results;
|
|
_ref = this.rawList;
|
|
_results = [];
|
|
|
|
for (key in _ref)
|
|
{
|
|
value = _ref[key];
|
|
|
|
if (!isNaN(key - 0))
|
|
{
|
|
this.groupedFixtures[key] = this.groupedFixtures[key] || [];
|
|
this.groupedFixtures[key] = this.groupedFixtures[key].concat(value);
|
|
}
|
|
else
|
|
{
|
|
this.namedFixtures[key] = this.flatten(value);
|
|
}
|
|
|
|
_results.push(this.allFixtures = this.flatten(this.groupedFixtures));
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
* A helper to flatten arrays. This is very useful as the fixtures are nested from time to time due to the way P2 creates and splits polygons.
|
|
*
|
|
* @method Phaser.Physics.P2.FixtureList#flatten
|
|
* @param {array} array - The array to flatten. Notice: This will happen recursive not shallow.
|
|
*/
|
|
flatten: function (array) {
|
|
|
|
var result, self;
|
|
result = [];
|
|
self = arguments.callee;
|
|
|
|
array.forEach(function(item) {
|
|
return Array.prototype.push.apply(result, (Array.isArray(item) ? self(item) : [item]));
|
|
});
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}; |