2019-03-17 23:45:48 -05:00
|
|
|
import {compose} from '@avocado/core';
|
|
|
|
import {Vector} from '@avocado/math';
|
|
|
|
|
|
|
|
import {simpleState, Trait} from '../trait';
|
|
|
|
|
|
|
|
const decorate = compose(
|
|
|
|
simpleState('isMobile'),
|
|
|
|
simpleState('speed'),
|
|
|
|
)
|
|
|
|
|
|
|
|
class MobileBase extends Trait {
|
|
|
|
|
|
|
|
static defaultState() {
|
|
|
|
return {
|
|
|
|
isMobile: true,
|
|
|
|
speed: 0,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2019-03-19 11:25:42 -05:00
|
|
|
initialize() {
|
2019-03-17 23:45:48 -05:00
|
|
|
this.requestedMovement = [0, 0];
|
|
|
|
}
|
|
|
|
|
|
|
|
actions() {
|
|
|
|
return {
|
|
|
|
requestMovement: (vector) => {
|
|
|
|
if (!this.isMobile) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.requestedMovement = Vector.scale(
|
|
|
|
Vector.hypotenuse(vector),
|
|
|
|
this.speed
|
|
|
|
);
|
|
|
|
this.entity.emit('movementRequest', this.requestedMovement);
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
listeners() {
|
|
|
|
return {
|
|
|
|
tick: (elapsed) => {
|
|
|
|
if (Vector.isZero(this.requestedMovement)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const requestedMovement = Vector.scale(
|
|
|
|
this.requestedMovement,
|
|
|
|
elapsed
|
|
|
|
);
|
|
|
|
this.requestedMovement = [0, 0];
|
|
|
|
this.entity.x += requestedMovement[0];
|
|
|
|
this.entity.y += requestedMovement[1];
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Mobile extends decorate(MobileBase) {}
|