UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

138 lines (118 loc) 4.19 kB
/** * The `Matter.Pairs` module contains methods for creating and manipulating collision pair sets. * * @class Pairs */ var Pairs = {}; module.exports = Pairs; var Pair = require('./Pair'); var Common = require('../core/Common'); (function() { /** * Creates a new pairs structure. * @method create * @param {object} options * @return {pairs} A new pairs structure */ Pairs.create = function(options) { return Common.extend({ table: {}, list: [], collisionStart: [], collisionActive: [], collisionEnd: [] }, options); }; /** * Updates pairs given a list of collisions. * @method update * @param {object} pairs * @param {collision[]} collisions * @param {number} timestamp */ Pairs.update = function(pairs, collisions, timestamp) { var pairUpdate = Pair.update, pairCreate = Pair.create, pairSetActive = Pair.setActive, pairsTable = pairs.table, pairsList = pairs.list, pairsListLength = pairsList.length, pairsListIndex = pairsListLength, collisionStart = pairs.collisionStart, collisionEnd = pairs.collisionEnd, collisionActive = pairs.collisionActive, collisionsLength = collisions.length, collisionStartIndex = 0, collisionEndIndex = 0, collisionActiveIndex = 0, collision, pair, i; // clear collision state arrays, but maintain old reference for (i = 0; i < collisionsLength; i++) { collision = collisions[i]; pair = collision.pair; if (pair) { // pair already exists (but may or may not be active) if (pair.isActive) { // pair exists and is active collisionActive[collisionActiveIndex++] = pair; // pair exists but was inactive, so a collision has just started again } // update the pair pairUpdate(pair, collision, timestamp); } else { // pair did not exist, create a new pair pair = pairCreate(collision, timestamp); pairsTable[pair.id] = pair; // push the new pair collisionStart[collisionStartIndex++] = pair; pairsList[pairsListIndex++] = pair; } } // find pairs that are no longer active pairsListIndex = 0; pairsListLength = pairsList.length; for (i = 0; i < pairsListLength; i++) { pair = pairsList[i]; if (pair.timeUpdated >= timestamp) { pairsList[pairsListIndex++] = pair; } else { pairSetActive(pair, false, timestamp); if (pair.collision.bodyA.sleepCounter > 0 && pair.collision.bodyB.sleepCounter > 0) { pairsList[pairsListIndex++] = pair; } else { collisionEnd[collisionEndIndex++] = pair; delete pairsTable[pair.id]; } } } // remove inactive pairs if (pairsList.length !== pairsListIndex) { pairsList.length = pairsListIndex; } if (collisionStart.length !== collisionStartIndex) { collisionStart.length = collisionStartIndex; } if (collisionEnd.length !== collisionEndIndex) { collisionEnd.length = collisionEndIndex; } if (collisionActive.length !== collisionActiveIndex) { collisionActive.length = collisionActiveIndex; } }; /** * Clears the given pairs structure. * @method clear * @param {pairs} pairs * @return {pairs} pairs */ Pairs.clear = function(pairs) { pairs.table = {}; pairs.list.length = 0; pairs.collisionStart.length = 0; pairs.collisionActive.length = 0; pairs.collisionEnd.length = 0; return pairs; }; })();