avocado-old/packages/topdown/traits/layered.trait.js

94 lines
1.7 KiB
JavaScript
Raw Normal View History

2019-04-14 20:21:52 -05:00
import {Trait} from '@avocado/entity';
2019-05-27 16:55:02 -05:00
import {Vector} from '@avocado/math';
2019-03-27 01:03:05 -05:00
export class Layered extends Trait {
2019-05-05 04:26:35 -05:00
static type() {
return 'layered';
}
constructor(entity, params, state) {
super(entity, params, state);
this.entity.layer = null;
2019-05-27 16:55:02 -05:00
this._tile = [0, 0];
this._tileOffset = [0, 0];
this.setCurrentTileFromLayer();
2019-03-27 01:03:05 -05:00
}
destroy() {
this.entity.removeFromLayer();
2019-03-27 01:03:05 -05:00
}
2019-05-27 16:55:02 -05:00
get tile() {
return this._tile;
}
get tileOffset() {
return this._tileOffset;
}
onLayerTilesetChanged() {
this.setCurrentTileFromLayer();
}
setCurrentTileFromLayer() {
const layer = this.entity.layer;
if (!layer) {
return;
}
if (!this.entity.is('positioned')) {
return;
}
const tileset = layer.tileset;
if (!tileset) {
return;
}
this._tile = Vector.div(
this.entity.position,
tileset.tileSize,
);
this._tileOffset = Vector.mod(
this.entity.position,
tileset.tileSize,
);
}
listeners() {
return {
positionChanged: () => {
this.setCurrentTileFromLayer();
},
traitAdded: () => {
this.setCurrentTileFromLayer();
},
}
}
methods() {
return {
removeFromLayer: () => {
const layer = this.entity.layer;
if (!layer) {
return;
}
2019-05-27 16:55:02 -05:00
layer.off('tilesetChanged', this.onLayerTilesetChanged);
this.entity.layer = null;
this.entity.emit('removedFromLayer', layer);
},
setIntoLayer: (layer) => {
this.entity.layer = layer;
2019-05-27 16:55:02 -05:00
layer.on('tilesetChanged', this.onLayerTilesetChanged, this);
this.entity.emit('addedToLayer');
},
2019-03-27 01:03:05 -05:00
};
2019-03-27 01:03:05 -05:00
}
}