avocado-old/packages/topdown/layer-view.js
2019-04-12 18:49:07 -05:00

80 lines
2.2 KiB
JavaScript

import {Container, Sprite} from '@avocado/graphics';
import {Vector} from '@avocado/math';
import {Layer} from './layer';
import {TilesRenderer} from './tiles-renderer';
export class LayerView extends Container {
constructor(layer, renderer) {
super();
this.layer = layer;
this.entityContainer = new Container();
this.layerContainer = new Container();
this._renderer = renderer;
// Handle entity add/remove.
this.onEntityAdded = this.onEntityAdded.bind(this);
layer.on('entityAdded', this.onEntityAdded);
this.onEntityRemoved = this.onEntityRemoved.bind(this);
layer.on('entityRemoved', this.onEntityRemoved);
for (const entity of layer.entityList) {
this.onEntityAdded(entity);
}
// Watch tile data change.
this.onTileDataChanged = this.onTileDataChanged.bind(this);
layer.on('tileDataChanged', this.onTileDataChanged);
// Watch tileset change.
this.onTilesetChanged = this.onTilesetChanged.bind(this);
layer.on('tilesetChanged', this.onTilesetChanged);
// Add to graphics.
this.addChild(this.layerContainer);
this.addChild(this.entityContainer);
}
destroy() {
super.destroy();
layer.off('entityAdded', this.onEntityAdded);
layer.off('entityRemoved', this.onEntityRemoved);
layer.off('tileDataChanged', this.onTileDataChanged);
layer.off('tilesetChanged', this.onTilesetChanged);
}
onEntityAdded(entity) {
if ('container' in entity) {
this.entityContainer.addChild(entity.container);
}
}
onEntityRemoved(entity) {
if ('container' in entity) {
this.entityContainer.removeChild(entity.container);
}
}
onTileDataChanged() {
this.render();
}
onTilesetChanged() {
this.render();
}
render() {
this.layerContainer.removeAllChildren();
if (!this._renderer) {
return;
}
if (!this.layer.tileset) {
return;
}
if (Vector.isZero(this.layer.tiles.size)) {
return;
}
const tilesRenderer = new TilesRenderer(this.layer.tiles, this.layer.tileset);
const chunk = tilesRenderer.renderChunk(this._renderer);
const tilesSprite = new Sprite(chunk);
this.layerContainer.addChild(tilesSprite);
}
}