2019-03-17 23:45:48 -05:00
|
|
|
import {compose} from '@avocado/core';
|
|
|
|
import {Vector} from '@avocado/math';
|
|
|
|
|
2019-03-23 23:24:18 -05:00
|
|
|
import {StateProperty, Trait} from '../trait';
|
2019-03-17 23:45:48 -05:00
|
|
|
|
|
|
|
const decorate = compose(
|
2019-03-23 23:24:18 -05:00
|
|
|
StateProperty('isMobile'),
|
|
|
|
StateProperty('speed'),
|
2019-03-17 23:45:48 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
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];
|
|
|
|
}
|
|
|
|
|
2019-03-20 18:32:54 -05:00
|
|
|
methods() {
|
2019-03-17 23:45:48 -05:00
|
|
|
return {
|
2019-03-20 18:32:54 -05:00
|
|
|
|
2019-03-23 18:26:35 -05:00
|
|
|
applyMovement: (movement) => {
|
|
|
|
this.entity.x += movement[0];
|
|
|
|
this.entity.y += movement[1];
|
|
|
|
},
|
|
|
|
|
2019-03-17 23:45:48 -05:00
|
|
|
requestMovement: (vector) => {
|
|
|
|
if (!this.isMobile) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.requestedMovement = Vector.scale(
|
2019-03-27 17:53:18 -05:00
|
|
|
Vector.normalize(vector),
|
2019-03-17 23:45:48 -05:00
|
|
|
this.speed
|
|
|
|
);
|
|
|
|
this.entity.emit('movementRequest', this.requestedMovement);
|
|
|
|
},
|
2019-03-20 19:31:35 -05:00
|
|
|
|
2019-03-17 23:45:48 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
listeners() {
|
|
|
|
return {
|
|
|
|
tick: (elapsed) => {
|
|
|
|
if (Vector.isZero(this.requestedMovement)) {
|
|
|
|
return;
|
|
|
|
}
|
2019-03-23 18:49:19 -05:00
|
|
|
if (this.entity.is('physical')) {
|
2019-03-24 03:24:35 -05:00
|
|
|
this.entity.applyImpulse(this.requestedMovement, elapsed);
|
2019-03-23 18:26:35 -05:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
const requestedMovement = Vector.scale(
|
|
|
|
this.requestedMovement,
|
|
|
|
elapsed
|
|
|
|
);
|
|
|
|
this.entity.applyMovement(requestedMovement);
|
|
|
|
}
|
2019-03-17 23:45:48 -05:00
|
|
|
this.requestedMovement = [0, 0];
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Mobile extends decorate(MobileBase) {}
|