well, that works

This commit is contained in:
kolaflash
2025-11-25 23:59:27 +01:00
parent 104f0998e1
commit 431a0bee2c
4 changed files with 83 additions and 22 deletions
+31 -6
View File
@@ -16,6 +16,10 @@ export type EntityInstance = {
sprite: Sprite; sprite: Sprite;
}; };
export type Draw = (ctx: CanvasRenderingContext2D) => void;
export type Process = (delta: number) => void;
export function createEntity( export function createEntity(
id: string, id: string,
src: string, src: string,
@@ -25,12 +29,33 @@ export function createEntity(
return { id, width, height, src }; return { id, width, height, src };
} }
export async function loadEntity(name: string): Promise<EntityInstance> { export const entityMap = new Map<string, EntityInstance>();
const entity = (await import(`#/entities/${name}/index.ts`)).default; export const entityDrawMap = new Map<string, Draw>();
export const entityProcessMap = new Map<string, Process>();
const { width, height } = entity; export async function useEntity(data: Entity): Promise<{
const sprite = createSprite(await loadImage(entity.src), 2, 4); draw: (fn: Draw) => void;
const position = createVector(); 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,
};
} }
+42 -1
View File
@@ -1,3 +1,12 @@
import {
type Draw as EntityDraw,
type EntityInstance,
type Process as EntityProcess,
entityDrawMap,
entityMap,
entityProcessMap,
} from "./Entity.ts";
export type SceneData = { export type SceneData = {
id: string; id: string;
width: number; width: number;
@@ -7,6 +16,11 @@ export type SceneData = {
export type Scene = { export type Scene = {
data: SceneData; data: SceneData;
entityPool: Array<{
draw: EntityDraw;
process: EntityProcess;
entity: EntityInstance;
}>;
process: Process; process: Process;
}; };
@@ -27,8 +41,21 @@ export const currentScene: Scene = {
entities: [], entities: [],
}, },
process: () => {}, 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): { export function useScene(data: SceneData): {
process: (fn: Process) => void; process: (fn: Process) => void;
} { } {
@@ -36,7 +63,11 @@ export function useScene(data: SceneData): {
return { return {
process(fn: Process): void { 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<void> {
const data = sceneDataMap.get(name)!; const data = sceneDataMap.get(name)!;
currentScene.data = data; 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)!; const process = sceneProcessMap.get(name)!;
currentScene.process = process; currentScene.process = process;
} }
+9 -2
View File
@@ -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"; 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) => {});
+1 -13
View File
@@ -1,18 +1,6 @@
import { type EntityInstance, loadEntity } from "#/engine/Entity.ts";
import { useScene } from "#/engine/Scene.ts"; import { useScene } from "#/engine/Scene.ts";
import { drawSprite } from "#/lib/Sprite.ts";
import data from "./data.json"; import data from "./data.json";
const { process } = useScene(data); const { process } = useScene(data);
const entities: Array<EntityInstance> = []; process((_ctx, _delta) => {});
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);
}
});