73 lines
2.0 KiB
JavaScript
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();
|
|
}
|
|
|
|
}
|