We are back in rendering land

This commit is contained in:
Schluffe
2026-02-22 01:11:16 +01:00
parent c0bf2cfd01
commit 61f1c30557
2 changed files with 23 additions and 2 deletions
+21 -2
View File
@@ -5,6 +5,7 @@ import {
} from "#/engine/Entity.ts"; } from "#/engine/Entity.ts";
import { type Graph, getNeighbours } from "#/engine/Graph.ts"; import { type Graph, getNeighbours } from "#/engine/Graph.ts";
import { useWithAsyncCache } from "#/engine/lib/cache.ts"; import { useWithAsyncCache } from "#/engine/lib/cache.ts";
import { playAnimation } from "./Sprite";
export type EntityData = { export type EntityData = {
name: string; name: string;
@@ -48,7 +49,7 @@ export const sceneDataMap = new Map<string, SceneData>();
export const sceneEntiyMap = new Map<string, EntityMap>(); export const sceneEntiyMap = new Map<string, EntityMap>();
export const sceneGraph: Graph<string> = new Map(); export const sceneGraph: Graph<string> = new Map();
const sceneInstancesMap = new Map<string, Array<object>>(); const sceneInstancesDrawMap = new Map<string, Array<object>>();
export const [loadScene, sceneCache] = useWithAsyncCache( export const [loadScene, sceneCache] = useWithAsyncCache(
async (name: string) => { async (name: string) => {
@@ -103,6 +104,22 @@ function processEntities(delta: number): void {
} }
} }
// TODO: type stuff and fixme WIP
function processSystems(ctx: CanvasRenderingContext2D, delta: number): void {
const drawables = sceneInstancesDrawMap.get(currentScene.data.name)!;
for (const drawable of drawables.sort(
(a, b) => b.position.y - a.position.y,
)) {
playAnimation(
ctx,
drawable.animation,
drawable.position.x,
drawable.position.y,
delta,
);
}
}
function linkScenes(a: string, b: string): void { function linkScenes(a: string, b: string): void {
if (sceneGraph.has(a)) { if (sceneGraph.has(a)) {
sceneGraph.get(a)!.push(b); sceneGraph.get(a)!.push(b);
@@ -136,6 +153,7 @@ export function defineScene(data: SceneData): {
sceneProcessMap.set(data.name, (ctx, delta) => { sceneProcessMap.set(data.name, (ctx, delta) => {
fn(ctx, delta); fn(ctx, delta);
processEntities(delta); processEntities(delta);
processSystems(ctx, delta);
}); });
}, },
preProcess(fn) { preProcess(fn) {
@@ -158,7 +176,8 @@ export async function setScene(name: string): Promise<void> {
const data = sceneDataMap.get(name)!; const data = sceneDataMap.get(name)!;
const process = sceneProcessMap.get(name)!; const process = sceneProcessMap.get(name)!;
const entityInstanceMap = sceneEntiyMap.get(name)!; const entityInstanceMap = sceneEntiyMap.get(name)!;
sceneInstancesMap.set( // TODO: test for drawable first
sceneInstancesDrawMap.set(
data.name, data.name,
entityInstanceMap.values().reduce( entityInstanceMap.values().reduce(
(acc, cur) => { (acc, cur) => {
+2
View File
@@ -1,9 +1,11 @@
import { defineEntity } from "#/engine/Entity.ts"; import { defineEntity } from "#/engine/Entity.ts";
import { createSpriteAnimation, useSpriteSheetSrc } from "#/engine/Sprite.ts"; import { createSpriteAnimation, useSpriteSheetSrc } from "#/engine/Sprite.ts";
import { createVector } from "#/engine/Vector";
import portal from "#/game/assets/portal.png"; import portal from "#/game/assets/portal.png";
const portalSheet = await useSpriteSheetSrc(portal, 3, 1); const portalSheet = await useSpriteSheetSrc(portal, 3, 1);
defineEntity("portal", { defineEntity("portal", {
position: createVector(64, 64),
animation: createSpriteAnimation(portalSheet, 400, 0), animation: createSpriteAnimation(portalSheet, 400, 0),
}); });