68 lines
1.7 KiB
TypeScript
68 lines
1.7 KiB
TypeScript
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<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")!.map.values(),
|
|
] as Array<Box<Sprite>>;
|
|
|
|
sceneComponentsMap
|
|
.get(sceneData.name)!
|
|
.get("position")!
|
|
.map.values()
|
|
.forEach((box, index) => {
|
|
drawables.push({
|
|
position: box as Box<Vector>,
|
|
sprite: sprites[index],
|
|
});
|
|
});
|
|
});
|
|
|
|
export function drawSprites(ctx: CanvasRenderingContext2D): void {
|
|
const { bounds } = 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 > bounds.minX &&
|
|
relX < bounds.maxX &&
|
|
relY + sprite.height > bounds.minY &&
|
|
relY < bounds.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,
|
|
);
|
|
}
|
|
}
|