38 lines
737 B
JavaScript
38 lines
737 B
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();
|
|
}
|
|
|
|
associateBodyWithEntity(body, entity) {
|
|
this.entities.set(body, entity);
|
|
body.position = entity.position;
|
|
}
|
|
|
|
removeBody(body) {
|
|
this.entities.delete(body);
|
|
}
|
|
|
|
tick(elapsed) {
|
|
// Propagate position updates.
|
|
for (const entity of this.entities.values()) {
|
|
if (Vector.equalsClose(entity.position, entity.body.position)) {
|
|
continue;
|
|
}
|
|
entity.position = entity.body.position;
|
|
}
|
|
}
|
|
|
|
}
|