Files

68 lines
1.7 KiB
TypeScript

import type { Box } from "#/engine/lib/box";
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<Vector>; sprite: Box<Sprite> };
const drawables: Array<Drawable> = [];
const visibleDrawables: Array<Drawable> = [];
sceneChangeSet.add((sceneData) => {
drawables.length = 0;
const sprites = [
...sceneComponentsMap.get(sceneData.name)!.get("sprite")!.values(),
] as Array<Box<Sprite>>;
sceneComponentsMap
.get(sceneData.name)!
.get("position")!
.values()
.forEach((box, index) => {
drawables.push({
position: box as Box<Vector>,
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,
);
}
}