import { System } from 'detect-collisions' import { EventEmitter } from 'node:events' export default class Game { entities = [] tickRate = 30 currentTick = 0 #eventEmitter = new EventEmitter() #system = new System() #tickBudget = Math.floor(1000 / this.tickRate) get eventEmitter() { return this.#eventEmitter } get system() { return this.#system } get tickBudget() { return this.#tickBudget } spawn_entity(entity) { this.entities.push(entity) this.#system.insert(entity.collider) entity.game = this } async start() { const start = performance.now() await this.update() setTimeout(() => this.start(), Math.max(0, this.#tickBudget - (performance.now() - start))) } async update() { Promise.allSettled(this.entities.map((e) => e.update())) this.currentTick++ this.eventEmitter.emit('tick') } }