2019-04-14 20:21:52 -05:00
|
|
|
import {Trait} from '@avocado/entity';
|
2019-04-14 20:33:52 -05:00
|
|
|
|
|
|
|
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';
|
|
|
|
}
|
|
|
|
|
2019-05-06 04:03:43 -05:00
|
|
|
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')) {
|
2019-05-06 04:03:43 -05:00
|
|
|
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;
|
|
|
|
}
|
2019-05-06 04:03:43 -05:00
|
|
|
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) => {
|
|
|
|
if (-1 === [
|
|
|
|
'positioned',
|
|
|
|
'followed',
|
|
|
|
].indexOf(type)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.updatePosition();
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2019-04-12 13:05:30 -05:00
|
|
|
|
|
|
|
tick(elapsed) {
|
|
|
|
this.updatePosition();
|
2019-04-23 16:56:47 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
renderTick(elapsed) {
|
2019-04-12 13:05:30 -05:00
|
|
|
this._camera.tick(elapsed);
|
|
|
|
}
|
|
|
|
|
2019-04-05 11:25:16 -05:00
|
|
|
}
|