avocado-old/packages/entity/traits/mobile.js

70 lines
1.4 KiB
JavaScript
Raw Normal View History

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];
}
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(
Vector.hypotenuse(vector),
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-23 18:26:35 -05:00
this.entity.applyImpulse(this.requestedMovement);
}
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) {}