avocado-old/packages/physics/abstract/world.js
2019-05-04 13:31:16 -05:00

64 lines
1.4 KiB
JavaScript

import {compose, Property, virtualize} from '@avocado/core';
import {Vector} from '@avocado/math';
const decorate = compose(
Property('stepTime', {
default: 1 / 60,
}),
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);
}
}
body.world = null;
}
tick(elapsed) {
this.tickPhysics(elapsed);
}
tickPhysics(elapsed) {
// Propagate position updates.
const it = this.entities.entries();
for (let value = it.next(); value.done !== true; value = it.next()) {
const body = value.value[0];
const entity = value.value[1];
const entityPosition = entity.position;
const bodyPosition = body.position;
// Hot.
if (
(entityPosition[0] << 0) === (bodyPosition[0] << 0)
&& (entityPosition[1] << 0) === (bodyPosition[1] << 0)
) {
continue;
}
entity.setPosition(body.position);
}
}
}