From aa08a8943a9a2d4a0e51893eebe6900bca7a7251 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Fri, 1 Mar 2024 16:45:58 -0700 Subject: ecs init --- src/engine/index.ts | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/engine/index.ts (limited to 'src/engine/index.ts') diff --git a/src/engine/index.ts b/src/engine/index.ts new file mode 100644 index 0000000..2df9f17 --- /dev/null +++ b/src/engine/index.ts @@ -0,0 +1,90 @@ +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.lastTimeStamp = performance.now(); + 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: string): Entity | undefined { + return this.entities.get(id); + } + + public removeEntity(id: string) { + this.entities.delete(id); + } + + public forEachEntityWithComponent( + componentName: string, + callback: (entity: Entity) => void, + ) { + this.componentEntities.get(componentName)?.forEach((entityId) => { + const entity = this.getEntity(entityId); + if (!entity) return; + + callback(entity); + }); + } + + 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): T { + return this.systems.get(name) as unknown as T; + } + + public doGameLoop(timeStamp: number) { + if (!this.running) { + return; + } + + const dt = timeStamp - this.lastTimeStamp; + this.lastTimeStamp = timeStamp; + + // rebuild the Component -> { Entity } map + 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