summaryrefslogtreecommitdiffstats
path: root/src/view/entity.ts
blob: 83cd9554b0808703507b6d57ba81b47e0004d2c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { EntityData } from '../model/data/entity';
import { Renderer } from './renderer/renderer';
import { SpriteCoords, SpriteView, SpriteViewBuilder } from './sprite';
import { loadImage, mkTexture } from './util/image';

import { vec2 } from 'gl-matrix';

export async function loadEntity(
	r: Renderer,
	data: EntityData,
): Promise<SpriteView[]> {
	const tile = await loadImage(`resources/sprite/entity/${data.sprite}.png`);

	const sprites: SpriteView[] = [];

	for (let frame = 0; frame < data.frames; frame++) {
		const [texture, coords] = mkTexture(r, tile, frame, data.frames);

		const offset = vec2.fromValues(coords[2] - coords[0], coords[3] - coords[1]);
		vec2.mul(offset, offset, data.anchor);
		r.snapToGrid(offset, offset);

		const anchorCoords: SpriteCoords = [
			coords[0] - offset[0],
			coords[1] - offset[1],
			coords[2] - offset[0],
			coords[3] - offset[1],
		];

		const builder = new SpriteViewBuilder(r, texture);
		builder.addSprite(anchorCoords, [0, 0, 1, 1]);
		sprites.push(builder.build());
	}

	return sprites;
}