From 72c6c7de12e9833f52bf2d0718d70f044f8ab57e Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Thu, 20 Jul 2023 20:47:32 -0700 Subject: a bit of refactoring; importing engine into bun for server --- engine/Game.ts | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 engine/Game.ts (limited to 'engine/Game.ts') diff --git a/engine/Game.ts b/engine/Game.ts new file mode 100644 index 0000000..c2a2c4f --- /dev/null +++ b/engine/Game.ts @@ -0,0 +1,76 @@ +import { Entity } from "./entities"; +import { System } from "./systems"; + +export class Game { + private systemOrder: string[]; + + private running: boolean; + private lastTimeStamp: number; + + public entities: Map; + public systems: Map; + public componentEntities: Map>; + + constructor() { + this.running = false; + this.systemOrder = []; + this.systems = new Map(); + this.entities = new Map(); + this.componentEntities = new Map(); + } + + public start() { + this.lastTimeStamp = performance.now(); + this.running = true; + } + + public addEntity(entity: Entity) { + this.entities.set(entity.id, entity); + } + + public getEntity(id: number): Entity { + return this.entities.get(id); + } + + public removeEntity(id: number) { + this.entities.delete(id); + } + + public addSystem(system: System) { + if (!this.systemOrder.includes(system.name)) { + this.systemOrder.push(system.name); + } + this.systems.set(system.name, system); + } + + public getSystem(name: string): System { + return this.systems.get(name); + } + + public doGameLoop = (timeStamp: number) => { + if (!this.running) { + return; + } + + const dt = timeStamp - this.lastTimeStamp; + this.lastTimeStamp = timeStamp; + + this.componentEntities.clear(); + this.entities.forEach((entity) => + entity.getComponents().forEach((component) => { + if (!this.componentEntities.has(component.name)) { + this.componentEntities.set( + component.name, + new Set([entity.id]) + ); + return; + } + this.componentEntities.get(component.name).add(entity.id); + }) + ); + + this.systemOrder.forEach((systemName) => { + this.systems.get(systemName).update(dt, this); + }); + }; +} -- cgit v1.2.3-70-g09d2