From 431a0bee2c462c90c3e59dcf0fcfd3efeded4f4d Mon Sep 17 00:00:00 2001 From: kolaflash Date: Tue, 25 Nov 2025 23:59:27 +0100 Subject: [PATCH] well, that works --- engine/Entity.ts | 37 ++++++++++++++++++++++++++----- engine/Scene.ts | 43 +++++++++++++++++++++++++++++++++++- entities/testEntity/index.ts | 11 +++++++-- scenes/testScene/index.ts | 14 +----------- 4 files changed, 83 insertions(+), 22 deletions(-) diff --git a/engine/Entity.ts b/engine/Entity.ts index 5400a54..ab225ad 100644 --- a/engine/Entity.ts +++ b/engine/Entity.ts @@ -16,6 +16,10 @@ export type EntityInstance = { sprite: Sprite; }; +export type Draw = (ctx: CanvasRenderingContext2D) => void; + +export type Process = (delta: number) => void; + export function createEntity( id: string, src: string, @@ -25,12 +29,33 @@ export function createEntity( return { id, width, height, src }; } -export async function loadEntity(name: string): Promise { - const entity = (await import(`#/entities/${name}/index.ts`)).default; +export const entityMap = new Map(); +export const entityDrawMap = new Map(); +export const entityProcessMap = new Map(); - const { width, height } = entity; - const sprite = createSprite(await loadImage(entity.src), 2, 4); - const position = createVector(); +export async function useEntity(data: Entity): Promise<{ + draw: (fn: Draw) => void; + process: (fn: Process) => void; + entity: EntityInstance; +}> { + const sprite = createSprite(await loadImage(data.src), 2, 4); - return { position, width, height, sprite }; + const entity: EntityInstance = { + position: createVector(), + width: data.width, + height: data.height, + sprite, + }; + + entityMap.set(data.id, entity); + + return { + draw(fn: Draw): void { + entityDrawMap.set(data.id, fn); + }, + process(fn: Process): void { + entityProcessMap.set(data.id, fn); + }, + entity, + }; } diff --git a/engine/Scene.ts b/engine/Scene.ts index 6cf8025..e55bea5 100644 --- a/engine/Scene.ts +++ b/engine/Scene.ts @@ -1,3 +1,12 @@ +import { + type Draw as EntityDraw, + type EntityInstance, + type Process as EntityProcess, + entityDrawMap, + entityMap, + entityProcessMap, +} from "./Entity.ts"; + export type SceneData = { id: string; width: number; @@ -7,6 +16,11 @@ export type SceneData = { export type Scene = { data: SceneData; + entityPool: Array<{ + draw: EntityDraw; + process: EntityProcess; + entity: EntityInstance; + }>; process: Process; }; @@ -27,8 +41,21 @@ export const currentScene: Scene = { entities: [], }, process: () => {}, + entityPool: [], }; +function drawEntities(ctx: CanvasRenderingContext2D): void { + for (const entity of currentScene.entityPool) { + entity.draw(ctx); + } +} + +function processEntities(delta: number): void { + for (const entity of currentScene.entityPool) { + entity.process(delta); + } +} + export function useScene(data: SceneData): { process: (fn: Process) => void; } { @@ -36,7 +63,11 @@ export function useScene(data: SceneData): { return { process(fn: Process): void { - sceneProcessMap.set(data.id, fn); + sceneProcessMap.set(data.id, (ctx, delta) => { + drawEntities(ctx); + processEntities(delta); + fn(ctx, delta); + }); }, }; } @@ -57,6 +88,16 @@ export async function loadScene(name: string): Promise { const data = sceneDataMap.get(name)!; currentScene.data = data; + for (const entity of data.entities) { + await import(`#/entities/${entity}/index.ts`); + + currentScene.entityPool.push({ + draw: entityDrawMap.get(entity)!, + process: entityProcessMap.get(entity)!, + entity: entityMap.get(entity)!, + }); + } + const process = sceneProcessMap.get(name)!; currentScene.process = process; } diff --git a/entities/testEntity/index.ts b/entities/testEntity/index.ts index c4d470d..3a8b89f 100644 --- a/entities/testEntity/index.ts +++ b/entities/testEntity/index.ts @@ -1,4 +1,11 @@ -import { createEntity } from "#/engine/Entity.ts"; +import { useEntity } from "#/engine/Entity.ts"; +import { drawSprite } from "#/lib/Sprite.ts"; import data from "./data.json"; -export default createEntity(data.id, data.src, data.width, data.height); +const { draw, process, entity } = await useEntity(data); + +draw((ctx: CanvasRenderingContext2D) => { + drawSprite(ctx, entity.sprite, 0, 0, 16, 16); +}); + +process((_delta) => {}); diff --git a/scenes/testScene/index.ts b/scenes/testScene/index.ts index 6b6a7f6..5bf8bd6 100644 --- a/scenes/testScene/index.ts +++ b/scenes/testScene/index.ts @@ -1,18 +1,6 @@ -import { type EntityInstance, loadEntity } from "#/engine/Entity.ts"; import { useScene } from "#/engine/Scene.ts"; -import { drawSprite } from "#/lib/Sprite.ts"; import data from "./data.json"; const { process } = useScene(data); -const entities: Array = []; -for (const entity of data.entities) { - const instance = await loadEntity(entity); - entities.push(instance); -} - -process((ctx, _delta) => { - for (const instance of entities) { - drawSprite(ctx, instance.sprite, 0, 0, 16, 16); - } -}); +process((_ctx, _delta) => {});