64 lines
1.4 KiB
JavaScript
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);
|
|
}
|
|
}
|
|
|
|
}
|