CollisionDataContainer.js

import {arrayCache} from './utils/array.js';
import recycle from 'recycle';

/**
 * CollisionDataContainer holds lists of CollisionData passed to entities during collisions with other entities. This class is primarily used by the ["HandlerCollision"]("HandlerCollision"%20Component.html) Component to trigger messages on child entities as collisions occur.
 *
 * @memberof platypus
 * @class CollisionDataContainer
 * @return {platypus.CollisionDataContainer} Returns the new aabb object.
 */
const
    CollisionDataContainer = function () {
        if (!this.xData && !this.yData) {
            this.xData = arrayCache.setUp();
            this.yData = arrayCache.setUp();
            this.xDeltaMovement = Infinity;
            this.yDeltaMovement = Infinity;
        } else {
            this.reset();
        }
    },
    proto = CollisionDataContainer.prototype;

/**
 * Adds a CollisionData object to the container's X-axis if the movement distance is less than or equal to collision data collected so far.
 *
 * @method platypus.CollisionDataContainer#tryToAddX
 * @param collisionData {platypus.CollisionData} The collision data to add.
 * @return {Boolean} Whether the collision data was added.
 */
proto.tryToAddX = function (collisionData) {
    if (collisionData.deltaMovement > this.xDeltaMovement) {
        return false;
    } else if (collisionData.deltaMovement < this.xDeltaMovement) {
        this.resetX(collisionData.deltaMovement);
    }

    this.xData.push(collisionData);

    return true;
};

/**
 * Adds a CollisionData object to the container's Y-axis if the movement distance is less than or equal to collision data collected so far.
 *
 * @method platypus.CollisionDataContainer#tryToAddY
 * @param collisionData {platypus.CollisionData} The collision data to add.
 * @return {Boolean} Whether the collision data was added.
 */
proto.tryToAddY = function (collisionData) {
    if (collisionData.deltaMovement > this.yDeltaMovement) {
        return false;
    } else if (collisionData.deltaMovement < this.yDeltaMovement) {
        this.resetY(collisionData.deltaMovement);
    }
    
    this.yData.push(collisionData);
    
    return true;
};

/**
 * Resets the X and Y axes.
 *
 * @method platypus.CollisionDataContainer#reset
 */
proto.reset = function () {
    this.resetX(Infinity);
    this.resetY(Infinity);
};

/**
 * Resets the X axis.
 *
 * @param delta {Number} The delta value of the X-axis.
 * @method platypus.CollisionDataContainer#resetX
 */
proto.resetX = function (delta) {
    const
        {xData} = this;
    let i = xData.length;
    
    while (i--) {
        xData[i].recycle();
    }
    xData.length = 0;
    this.xDeltaMovement = delta;
};

/**
 * Resets the Y axis.
 *
 * @param delta {Number} The delta value of the Y-axis.
 * @method platypus.CollisionDataContainer#resetY
 */
proto.resetY = function (delta) {
    const
        {yData} = this;
    let i = yData.length;
    
    while (i--) {
        yData[i].recycle();
    }
    yData.length = 0;
    this.yDeltaMovement = delta;
};

/**
 * Returns an CollisionDataContainer from cache or creates a new one if none are available.
 *
 * @method platypus.CollisionDataContainer.setUp
 * @return {platypus.CollisionDataContainer} The instantiated CollisionDataContainer.
 */
/**
 * Returns a CollisionDataContainer back to the cache.
 *
 * @method platypus.CollisionDataContainer.recycle
 * @param CollisionDataContainer {platypus.CollisionDataContainer} The CollisionDataContainer to be recycled.
 */
/**
 * Relinquishes properties of the CollisionDataContainer and recycles it.
 *
 * @method platypus.CollisionDataContainer#recycle
 */
recycle.add(CollisionDataContainer, 'CollisionDataContainer', CollisionDataContainer, null, true);

export default CollisionDataContainer;