diff --git a/engine/Entity.ts b/engine/Entity.ts index ab225ad..5619153 100644 --- a/engine/Entity.ts +++ b/engine/Entity.ts @@ -1,6 +1,5 @@ -import { loadImage } from "#/lib/loadImage.ts"; -import { createSprite, type Sprite } from "#/lib/Sprite.ts"; -import { createVector, type Vector } from "#/lib/Vector.ts"; +import type { Sprite } from "#/lib/Sprite.ts"; +import type { Vector } from "#/lib/Vector.ts"; export type Entity = { id: string; @@ -16,9 +15,12 @@ export type EntityInstance = { sprite: Sprite; }; -export type Draw = (ctx: CanvasRenderingContext2D) => void; +export type Draw = ( + entity: EntityInstance, + ctx: CanvasRenderingContext2D, +) => void; -export type Process = (delta: number) => void; +export type Process = (entity: EntityInstance, delta: number) => void; export function createEntity( id: string, @@ -29,25 +31,15 @@ export function createEntity( return { id, width, height, src }; } -export const entityMap = new Map(); +export const entityMap = new Map(); export const entityDrawMap = new Map(); export const entityProcessMap = new Map(); -export async function useEntity(data: Entity): Promise<{ +export function useEntity(data: Entity): { draw: (fn: Draw) => void; process: (fn: Process) => void; - entity: EntityInstance; -}> { - const sprite = createSprite(await loadImage(data.src), 2, 4); - - const entity: EntityInstance = { - position: createVector(), - width: data.width, - height: data.height, - sprite, - }; - - entityMap.set(data.id, entity); +} { + entityMap.set(data.id, data); return { draw(fn: Draw): void { @@ -56,6 +48,5 @@ export async function useEntity(data: Entity): Promise<{ process(fn: Process): void { entityProcessMap.set(data.id, fn); }, - entity, }; } diff --git a/engine/Scene.ts b/engine/Scene.ts index e55bea5..c93d0fb 100644 --- a/engine/Scene.ts +++ b/engine/Scene.ts @@ -1,3 +1,6 @@ +import { loadImage } from "#/lib/loadImage.ts"; +import { createSprite } from "#/lib/Sprite.ts"; +import { createVector, type Vector } from "#/lib/Vector.ts"; import { type Draw as EntityDraw, type EntityInstance, @@ -11,7 +14,10 @@ export type SceneData = { id: string; width: number; height: number; - entities: string[]; + entities: Array<{ + id: string; + position: Vector; + }>; }; export type Scene = { @@ -45,14 +51,14 @@ export const currentScene: Scene = { }; function drawEntities(ctx: CanvasRenderingContext2D): void { - for (const entity of currentScene.entityPool) { - entity.draw(ctx); + for (const entry of currentScene.entityPool) { + entry.draw(entry.entity, ctx); } } function processEntities(delta: number): void { - for (const entity of currentScene.entityPool) { - entity.process(delta); + for (const entry of currentScene.entityPool) { + entry.process(entry.entity, delta); } } @@ -89,12 +95,20 @@ export async function loadScene(name: string): Promise { currentScene.data = data; for (const entity of data.entities) { - await import(`#/entities/${entity}/index.ts`); + await import(`#/entities/${entity.id}/index.ts`); + + const e = entityMap.get(entity.id)!; + const entityInstance: EntityInstance = { + position: entity.position, + width: e.width, + height: e.height, + sprite: createSprite(await loadImage(e.src), 2, 4), // FIXME + }; currentScene.entityPool.push({ - draw: entityDrawMap.get(entity)!, - process: entityProcessMap.get(entity)!, - entity: entityMap.get(entity)!, + draw: entityDrawMap.get(entity.id)!, + process: entityProcessMap.get(entity.id)!, + entity: entityInstance, }); } diff --git a/entities/testEntity/index.ts b/entities/testEntity/index.ts index 3a8b89f..1fcf6a5 100644 --- a/entities/testEntity/index.ts +++ b/entities/testEntity/index.ts @@ -1,11 +1,18 @@ -import { useEntity } from "#/engine/Entity.ts"; +import { type EntityInstance, useEntity } from "#/engine/Entity.ts"; import { drawSprite } from "#/lib/Sprite.ts"; import data from "./data.json"; -const { draw, process, entity } = await useEntity(data); +const { draw, process } = useEntity(data); -draw((ctx: CanvasRenderingContext2D) => { - drawSprite(ctx, entity.sprite, 0, 0, 16, 16); +draw((entity: EntityInstance, ctx: CanvasRenderingContext2D) => { + drawSprite( + ctx, + entity.sprite, + entity.position.x, + entity.position.y, + entity.width, + entity.height, + ); }); -process((_delta) => {}); +process((_entity, _delta) => {}); diff --git a/scenes/testScene/data.json b/scenes/testScene/data.json index 8cf94b8..ef49572 100644 --- a/scenes/testScene/data.json +++ b/scenes/testScene/data.json @@ -2,5 +2,20 @@ "id": "testScene", "width": 48, "height": 48, - "entities": ["testEntity"] + "entities": [ + { + "id": "testEntity", + "position": { + "x": 0, + "y": 0 + } + }, + { + "id": "testEntity", + "position": { + "x": 16, + "y": 16 + } + } + ] }