summaryrefslogtreecommitdiffstats
path: root/src/view/entity.ts
blob: 3b30e3c4df0b550ebbe77c701e0f965ce80ba845 (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
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 [texture, size] = mkTexture(r, tile);
	const frameSize = [size[0], size[1] / data.frames];

	const offset = vec2.mul(vec2.create(), frameSize, data.anchor);
	r.snapToGrid(offset, offset);

	const coords: SpriteCoords = [
		-offset[0],
		-offset[1],
		-offset[0] + frameSize[0],
		-offset[1] + frameSize[1],
	];

	const sprites: SpriteView[] = [];

	for (let frame = 0; frame < data.frames; frame++) {
		const builder = new SpriteViewBuilder(r, texture);
		builder.addSprite(coords, [0, frame / data.frames, 1, (frame + 1) / data.frames]);
		sprites.push(builder.build());
	}

	return sprites;
}