import type { Box } from "#/engine/Box.ts"; import { sceneChangeSet, sceneComponentsMap } from "#/engine/Scene.ts"; import { drawSprite, type Sprite, spriteSheetMap } from "#/engine/Sprite.ts"; import type { Vector } from "#/engine/Vector.ts"; import { viewport } from "#/engine/Viewport.ts"; type Drawable = { position: Box; sprite: Box }; const drawables: Array = []; const visibleDrawables: Array = []; sceneChangeSet.add((sceneData) => { drawables.length = 0; const sprites = [ ...sceneComponentsMap.get(sceneData.name)!.get("sprite")!.map.values(), ] as Array>; sceneComponentsMap .get(sceneData.name)! .get("position")! .map.values() .forEach((box, index) => { drawables.push({ position: box as Box, sprite: sprites[index], }); }); }); export function drawSprites(ctx: CanvasRenderingContext2D): void { const { boundaries } = viewport; visibleDrawables.length = 0; for (const drawable of drawables) { const pos = drawable.position.value; const sprite = drawable.sprite.value; const relX = pos.x + sprite.offset.x; const relY = pos.y + sprite.offset.y; if ( relX + sprite.width > boundaries.minX && relX < boundaries.maxX && relY + sprite.height > boundaries.minY && relY < boundaries.maxY ) { visibleDrawables.push(drawable); } } for (const drawable of visibleDrawables.sort( (a, b) => a.position.value.y - b.position.value.y, )) { const sprite = drawable.sprite.value; const position = drawable.position.value; drawSprite( ctx, spriteSheetMap.get(sprite.src)!, sprite.xStart, sprite.yStart, position.x + sprite.offset.x, position.y + sprite.offset.y, ); } }