avocado-old/packages/topdown/tiles-view.js
2019-03-25 19:03:34 -05:00

73 lines
2.0 KiB
JavaScript

import {compose} from '@avocado/core';
import {Canvas, Container, Renderable, Sprite} from '@avocado/graphics';
import {Vector} from '@avocado/math';
export class TilesView extends Renderable {
constructor(tiles, tileset) {
super();
this.tiles = tiles;
this.tileset = tileset;
this.canvas = new Canvas();
this.sprite = undefined;
}
destroy() {
this.container.destroy();
}
indexMapFromSlice(slice) {
const indexes = new Map();
for (const i in slice) {
const tile = slice[i];
if (!indexes.get(tile)) {
indexes.set(tile, new Set());
}
indexes.get(tile).add(parseInt(i));
}
return indexes;
}
get internal() {
return this.canvas.internal;
}
renderWith(renderer) {
const size = this.tiles.size;
const tileSize = Vector.mul(this.tileset.tileSize, this.scale);
const rowWidth = size[0] * tileSize[0];
const canvasSize = Vector.mul(size, tileSize);
this.canvas.size = canvasSize;
const slice = this.tiles.slice([0, 0, size[0], size[1]]);
const indexMap = this.indexMapFromSlice(slice);
const container = new Container();
for (const [tile, indexes] of indexMap.entries()) {
let iterator = indexes.values();
let result = iterator.next();
while (!result.done) {
const position = [0, 0];
const validIndex = result.value;
for (const indexString in slice) {
const index = parseInt(indexString);
if (index === validIndex) {
const sprite = new Sprite(this.tileset.subimages[tile]);
sprite.scale = this.scale;
sprite.position = position;
container.addChild(sprite);
}
position[0] += tileSize[0];
if (rowWidth === position[0]) {
position[1] += tileSize[1];
position[0] = 0;
}
}
result = iterator.next();
}
}
this.canvas.renderWith(container, renderer);
container.destroy();
return this.canvas.toImage();
}
}