2019-03-24 00:46:31 -05:00
|
|
|
import * as I from 'immutable';
|
|
|
|
|
2019-03-24 01:16:24 -05:00
|
|
|
import {compose, virtualize} from '@avocado/core';
|
2019-03-24 00:46:31 -05:00
|
|
|
import {Rectangle, Vector} from '@avocado/math';
|
|
|
|
import {EventEmitter} from '@avocado/mixins';
|
|
|
|
|
2019-03-24 01:16:24 -05:00
|
|
|
import {AbstractBody} from '../abstract/body';
|
|
|
|
|
2019-03-24 00:46:31 -05:00
|
|
|
const decorate = compose(
|
|
|
|
EventEmitter,
|
|
|
|
Vector.Mixin('position', 'x', 'y', {
|
|
|
|
default: [0, 0],
|
|
|
|
track: true,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
|
2019-03-24 01:16:24 -05:00
|
|
|
export class Body extends decorate(AbstractBody) {
|
2019-03-24 00:46:31 -05:00
|
|
|
|
|
|
|
constructor(shape) {
|
2019-03-24 01:16:24 -05:00
|
|
|
super(shape);
|
2019-03-24 00:46:31 -05:00
|
|
|
this.force = [0, 0];
|
|
|
|
this.impulse = [0, 0];
|
|
|
|
this.contacts = I.Set();
|
|
|
|
}
|
|
|
|
|
|
|
|
get aabb() {
|
|
|
|
return Rectangle.translated(this.shape.aabb, this.position);
|
|
|
|
}
|
|
|
|
|
|
|
|
applyForce(vector) {
|
|
|
|
this.force = Vector.add(this.force, vector);
|
|
|
|
}
|
|
|
|
|
2019-03-24 03:24:35 -05:00
|
|
|
applyImpulse(vector, elapsed) {
|
|
|
|
this.impulse = Vector.add(
|
|
|
|
this.impulse,
|
|
|
|
Vector.scale(vector, elapsed)
|
|
|
|
);
|
2019-03-24 00:46:31 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|