avocado-old/packages/physics/abstract/world.js
2019-05-01 21:35:38 -05:00

54 lines
1.2 KiB
JavaScript

import {compose, virtualize} from '@avocado/core';
import {Vector} from '@avocado/math';
const decorate = compose(
virtualize([
'addBody',
'createBody',
]),
);
export class AbstractWorld extends decorate(class {}) {
constructor() {
super();
this.entities = new Map();
this.entitiesList = [];
}
associateBodyWithEntity(body, entity) {
this.entities.set(body, entity);
this.entitiesList.push(entity);
body.position = entity.position;
}
removeBody(body) {
if (this.entities.has(body)) {
const entity = this.entities.get(body);
this.entities.delete(body);
const index = this.entitiesList.indexOf(entity);
if (-1 !== index) {
this.entitiesList.splice(index, 1);
}
}
}
tick(elapsed) {
// Propagate position updates.
for (let i = 0; i < this.entitiesList.length; ++i) {
const entity = this.entitiesList[i];
const entityPosition = entity.position;
const bodyPosition = entity.body.position;
// Hot.
if (
(entityPosition[0] << 0) === (bodyPosition[0] << 0)
&& (entityPosition[1] << 0) === (bodyPosition[1] << 0)
) {
continue;
}
entity.setPosition(entity.body.position);
}
}
}