diff --git a/engine/Scene.ts b/engine/Scene.ts index c52eb6f..bd1d467 100644 --- a/engine/Scene.ts +++ b/engine/Scene.ts @@ -34,18 +34,16 @@ export type Scene = { export type SceneChange = (to: SceneData, from: SceneData) => void; -export const sceneDataMap = new Map(); -export const sceneProcessMap = new Map(); export const sceneComponentsMap = new Map(); - -const sceneEntityProcessMap = new Map>(); - -export const scenePreProcessMap = new Map(); -export const scenePostProcessMap = new Map(); - export const sceneChangeSet = new Set(); export const sceneGraph: Graph = new Map(); +const sceneEntityProcessMap = new Map>(); +const sceneDataMap = new Map(); +const sceneProcessMap = new Map(); +const scenePreProcessMap = new Map(); +const scenePostProcessMap = new Map(); + export const currentScene: Scene = { data: { name: "", diff --git a/game/scenes/testScene/data.json b/game/scenes/testScene/data.json index 4bcd694..257f969 100644 --- a/game/scenes/testScene/data.json +++ b/game/scenes/testScene/data.json @@ -29,6 +29,15 @@ "y": 32 } } + }, + { + "name": "testEntity", + "init": { + "position": { + "x": 64, + "y": 64 + } + } } ] } diff --git a/main.ts b/main.ts index cedbc14..30061a2 100644 --- a/main.ts +++ b/main.ts @@ -1,6 +1,12 @@ +import type { Box } from "#/engine/Box.ts"; import { listenKeyboard } from "#/engine/Keyboard.ts"; import { listenPointer } from "#/engine/Pointer.ts"; -import $, { currentScene, setScene } from "#/engine/Scene.ts"; +import $, { + currentScene, + sceneChangeSet, + sceneComponentsMap, + setScene, +} from "#/engine/Scene.ts"; import { animateSprite, drawSprite, @@ -16,6 +22,48 @@ import { viewport, } from "#/engine/Viewport.ts"; +function animateSpriteSystem() { + for (const [id, playback] of $("playback").entries()) { + const sprite = $("sprite").get(id)!; + animateSprite(sprite.value, playback.value, delta); + } +} + +const drawables: Array<{ position: Box; sprite: Box }> = []; +sceneChangeSet.add((sceneData) => { + drawables.length = 0; + + const sprites = [ + ...sceneComponentsMap.get(sceneData.name)!.get("sprite")!.values(), + ] as Array>; + + sceneComponentsMap + .get(sceneData.name)! + .get("position")! + .values() + .forEach((box, index) => { + drawables.push({ + position: box as Box, + sprite: sprites[index], + }); + }); +}); + +function drawSpriteSystem() { + for (const drawable of drawables.sort( + (a, b) => a.position.value.y - b.position.value.y, + )) { + drawSprite( + viewport.ctx, + spriteSheetMap.get(drawable.sprite.value.src)!, + drawable.sprite.value.xStart, + drawable.sprite.value.yStart, + drawable.position.value.x, + drawable.position.value.y, + ); + } +} + let then = self.performance.now(); let delta = 0; function animate(timestamp: number): void { @@ -25,22 +73,8 @@ function animate(timestamp: number): void { resetCtx(); currentScene.process(viewport.ctx, delta); - for (const [id, playback] of $("playback").entries()) { - const sprite = $("sprite").get(id)!; - animateSprite(sprite.value, playback.value, delta); - } - - for (const [id, sprite] of $("sprite").entries()) { - const position = $("position").get(id)!; - drawSprite( - viewport.ctx, - spriteSheetMap.get(sprite.value.src)!, - sprite.value.xStart, - sprite.value.yStart, - position.value.x, - position.value.y, - ); - } + animateSpriteSystem(); + drawSpriteSystem(); requestAnimationFrame(animate); }