avocado-old/packages/topdown/layer-view.js

68 lines
1.8 KiB
JavaScript
Raw Normal View History

2019-03-27 01:52:24 -05:00
import {Container, Sprite} from '@avocado/graphics';
2019-03-25 23:39:44 -05:00
import {Layer, Tileset, TilesRenderer} from '@avocado/topdown';
2019-03-27 01:52:24 -05:00
export class LayerView extends Container {
2019-03-25 23:39:44 -05:00
constructor(layer, renderer) {
super();
this.layer = layer;
2019-03-27 01:52:24 -05:00
this.entityContainer = new Container();
2019-03-26 09:30:25 -05:00
this.layerContainer = new Container();
2019-03-25 23:39:44 -05:00
this._renderer = renderer;
this._tileset = undefined;
2019-03-27 01:52:24 -05:00
// 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 tileset URI change.
this.onTilesetUriChanged = this.onTilesetUriChanged.bind(this);
layer.on('tilesetUriChanged', this.onTilesetUriChanged);
this.onTilesetUriChanged();
// Add to graphics.
this.addChild(this.layerContainer);
this.addChild(this.entityContainer);
}
destroy() {
super.destroy();
if (this._tileset) {
this._tileset.destroy();
}
}
onEntityAdded(entity) {
if ('container' in entity) {
this.entityContainer.addChild(entity.container);
}
}
onEntityRemoved(entity) {
if ('container' in entity) {
this.entityContainer.removeChild(entity.container);
}
2019-03-25 23:39:44 -05:00
}
2019-03-27 01:52:24 -05:00
onTilesetUriChanged() {
if (!this.layer.tilesetUri) {
return;
}
Tileset.load(this.layer.tilesetUri).then((tileset) => {
this.tileset = tileset;
});
2019-03-25 23:39:44 -05:00
}
set tileset(tileset) {
this._tileset = tileset;
const tilesRenderer = new TilesRenderer(this.layer.tiles, tileset);
const chunk = tilesRenderer.renderChunk(this._renderer);
const tilesSprite = new Sprite(chunk);
2019-03-26 09:30:25 -05:00
this.layerContainer.removeAllChildren();
this.layerContainer.addChild(tilesSprite);
2019-03-25 23:39:44 -05:00
}
}