diff --git a/engine/Scene.ts b/engine/Scene.ts index f2cec9f..a1618b1 100644 --- a/engine/Scene.ts +++ b/engine/Scene.ts @@ -46,6 +46,8 @@ export const sceneEntiyMap = new Map(); export const sceneChangedHandlers = new Set(); export const sceneGraph: Graph = new Map(); +const sceneInstancesMap = new Map>>(); + export const [loadScene, sceneCache] = useWithAsyncCache( async (name: string) => { await import(`#/scenes/${name}/scene.ts`); @@ -93,10 +95,13 @@ export const currentScene: Scene = { }; function animateEntities(ctx: CanvasRenderingContext2D, delta: number): void { - for (const entity of currentScene.entityInstanceMap.values()) { - for (const instance of entity.instances) { - entity.animate(instance as Entity, ctx, delta); - } + const instances = sceneInstancesMap.get(currentScene.data.name)!; + instances.sort((a, b) => a.position.y - b.position.y); + + for (const instance of instances) { + currentScene.entityInstanceMap + .get(instance.name)! + .animate(instance as Entity, ctx, delta); } } @@ -164,6 +169,18 @@ export async function setScene(name: string): Promise { const data = sceneDataMap.get(name)!; const process = sceneProcessMap.get(name)!; const entityInstanceMap = sceneEntiyMap.get(name)!; + sceneInstancesMap.set( + data.name, + entityInstanceMap.values().reduce( + (acc, cur) => { + for (const instance of cur.instances) { + acc.push(instance); + } + return acc; + }, + [] as Array>, + ), + ); const preProcess = scenePreProcessMap.get(name); if (preProcess) {