Home Reference Source

main/model/component/Body.js

import { Box2D } from 'link/Box2D';
import { Vector2 } from 'commons/math/Vector2';

export class Body {

    static get TYPE() {
        return {
            STATIC: Box2D.b2_staticBody,
            KINEMATIC: Box2D.b2_kinematicBody,
            DYNAMIC: Box2D.b2_dynamicBody
        }
    }

    static get STATE() {
        return {
            CREATED: 0,
            REGISTERED: 1
        }
    }

    static get FACTOR() {
        return 50;
    }

    constructor(type, shape, options = {}) {
        this._state = Body.STATE.CREATED;

        this.type = type;
        this.options = options;

        this.materialDef = new Box2D.b2FixtureDef();
        this.materialDef.set_shape(shape);
        if (options.density) this.materialDef.set_density(options.density);
        if (options.friction) this.materialDef.set_friction(options.friction);
        if (options.bounciness) this.materialDef.set_restitution(options.bounciness);
        if (options.isSensor) this.materialDef.set_isSensor(options.isSensor);

        this.bodyDef = new Box2D.b2BodyDef();
        this.bodyDef.set_type(type);
        if (options.preventTunneling) this.bodyDef.set_bullet(options.preventTunneling);
        if (options.allowRotation) this.bodyDef.set_fixedRotation(!options.allowRotation);
        if (options.angle) this.bodyDef.angle.set_angle(options.angle);

        this.body = null;
    }

    get state() {
        return this._state;
    }

    set state(state) {
        this._state = state;
    }

    get position() {
        return Vector2(
            this.body.GetPosition().get_x() * Body.FACTOR,
            this.body.GetPosition().get_y() * Body.FACTOR
        );
    }

    set position(position) {
        this.bodyDef.get_position().set_x(position.x / Body.FACTOR);
        this.bodyDef.get_position().set_y(position.y / Body.FACTOR);
    }

}