refactor: simpification & semantics

This commit is contained in:
cha0s 2019-03-25 20:26:37 -05:00
parent b6688ff2bb
commit b03abf5907
3 changed files with 51 additions and 73 deletions

View File

@ -1,3 +1,3 @@
export {TilesView} from './tiles-view'; export {TilesRenderer} from './tiles-renderer';
export {Tiles} from './tiles'; export {Tiles} from './tiles';
export {Tileset} from './tileset'; export {Tileset} from './tileset';

View File

@ -0,0 +1,50 @@
import {Canvas, Container, Sprite} from '@avocado/graphics';
import {Rectangle, Vector} from '@avocado/math';
export class TilesRenderer {
constructor(tiles, tileset) {
this.tiles = tiles;
this.tileset = tileset;
}
renderChunk(renderer, rectangle) {
// No rectangle? Render all.
if (!rectangle) {
rectangle = Rectangle.compose([0, 0], this.tiles.size);
}
const slice = this.tiles.slice(rectangle);
if (!slice) {
return undefined;
}
// Precalcs.
const size = Rectangle.size(rectangle);
const tileSize = this.tileset.tileSize;
const rowWidth = size[0] * tileSize[0];
// Render all tiles.
const container = new Container();
const position = [0, 0];
for (let i = 0; i < slice.length; ++i) {
const index = slice[i];
const sprite = new Sprite(this.tileset.subimages[index]);
sprite.position = position;
container.addChild(sprite);
// Only adds, please.
position[0] += tileSize[0];
if (rowWidth === position[0]) {
position[0] = 0;
position[1] += tileSize[1];
}
}
// Blit to canvas.
const canvasSize = Vector.mul(size, tileSize);
const canvas = new Canvas(canvasSize);
canvas.renderWith(container, renderer);
container.destroy();
// Convert to image and return.
const image = canvas.toImage();
canvas.destroy();
return image;
}
}

View File

@ -1,72 +0,0 @@
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();
}
}