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

92 lines
1.6 KiB
JavaScript
Raw Normal View History

2019-04-14 20:21:52 -05:00
import {Trait} from '@avocado/entity';
import {Camera} from '../camera';
2019-04-05 11:25:16 -05:00
export class Followed extends Trait {
static defaultParams() {
return {
viewSize: [320, 180],
}
}
2019-05-05 04:26:35 -05:00
static type() {
return 'followed';
}
constructor(entity, params, state) {
super(entity, params, state);
2019-04-05 11:25:16 -05:00
const camera = new Camera();
2019-05-04 14:06:47 -05:00
camera.viewSize = this.params.viewSize;
2019-04-05 11:25:16 -05:00
this._camera = camera;
this.updatePosition();
this.onRoomSizeChanged();
}
2019-04-30 17:11:41 -05:00
destroy() {
if (!this.entity.is('roomed')) {
return;
}
const room = this.entity.room;
if (room) {
room.off('sizeChanged', this.onRoomSizeChanged);
2019-04-30 17:11:41 -05:00
}
}
2019-04-05 11:25:16 -05:00
get camera() {
return this._camera;
}
onRoomSizeChanged() {
2019-04-30 18:34:13 -05:00
if (!this.entity.is('roomed')) {
return;
}
const room = this.entity.room;
if (room) {
this._camera.areaSize = room.size;
}
2019-04-05 11:25:16 -05:00
}
updatePosition() {
if (!this.entity.is('positioned')) {
return;
}
2019-04-11 12:20:24 -05:00
this._camera.position = this.entity.position;
2019-04-05 11:25:16 -05:00
}
listeners() {
return {
addedToRoom: () => {
this.onRoomSizeChanged();
2019-04-12 18:58:38 -05:00
this.entity.room.on('sizeChanged', this.onRoomSizeChanged, this);
2019-04-05 11:25:16 -05:00
},
removedFromRoom: (room) => {
room.off('sizeChanged', this.onRoomSizeChanged);
},
traitAdded: (type) => {
2019-09-29 13:19:57 -05:00
this.onRoomSizeChanged();
2019-04-05 11:25:16 -05:00
if (-1 === [
'positioned',
'followed',
].indexOf(type)) {
return;
}
this.updatePosition();
},
}
}
tick(elapsed) {
this.updatePosition();
2019-04-23 16:56:47 -05:00
}
renderTick(elapsed) {
this._camera.tick(elapsed);
}
2019-04-05 11:25:16 -05:00
}