Home Reference Source

src/server/collision-checker.js

/**
 * @ignore
 */
class CollisionChecker {

    constructor () {
        this.pair = [];
    }

    add (model, platforms, event) {

        if (!Array.isArray(platforms)) {
            platforms = [platforms];
        }

        this.pair.push({ model, platforms, event });
    }

    check (td) {
        let model, hasCollision;
        this.pair.forEach(pair => {
            model = Object.create(pair.model);
            model.step(td);
            hasCollision = this.hasCollisions(this.getHitbox(model), pair.platforms.map(el => this.getHitbox(el)));

            if (!!hasCollision) {
                pair.event(pair.model);
            }
        });
    }

    hasCollision (hitbox, hitboxes) {

        if (!Array.isArray(hitboxes)) {
            hitboxes = [hitboxes];
        }

        let rect;
        for (let i = 0; i < hitboxes.length; i++) {
            rect = hitboxes[i];

            if (hitbox.x < rect.x + rect.width &&
                hitbox.x + hitbox.width > rect.x &&
                hitbox.y < rect.y + rect.height &&
                hitbox.y + hitbox.height > rect.y
            ) {
                return true;
            }
        }

        return false;
    }

    getHitbox (model) {
        if (!!model.hitbox) {
            return {
                x: model.x + model.hitbox.x,
                y: model.y + model.hitbox.y,
                width: model.hitbox.width,
                height: model.hitbox.height
            }
        }

        return {
            x: model.x,
            y: model.y,
            width: model.width,
            height: model.height
        }
    }

    clear () {
        this.pair = [];
    }
}

module.exports = CollisionChecker;