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 [entityX, entityY] = entity.position; const [bodyX, bodyY] = entity.body.position; // Hot. if (entityX === bodyX && entityY === bodyY) { continue; } entity.position = entity.body.position; } } }