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

86 lines
1.8 KiB
JavaScript
Raw Normal View History

2019-04-09 09:22:41 -05:00
import {compose, TickingPromise} from '@avocado/core';
2019-03-17 23:45:48 -05:00
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
)
2019-05-05 04:26:35 -05:00
export class Mobile extends decorate(Trait) {
2019-03-17 23:45:48 -05:00
static defaultState() {
return {
isMobile: true,
speed: 0,
};
}
2019-05-05 04:26:35 -05:00
static type() {
return 'mobile';
}
constructor(entity, params, state) {
super(entity, params, state);
2019-05-31 16:57:59 -05:00
this.appliedMovement = [0, 0];
2019-03-17 23:45:48 -05:00
}
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-06-05 23:11:59 -05:00
moveFor: (vector, duration) => {
return new TickingPromise(
() => {},
(elapsed, resolve) => {
duration -= elapsed;
if (duration <= 0) {
return resolve();
}
this.entity.requestMovement(Vector.normalize(vector));
},
);
2019-04-09 09:22:41 -05:00
},
2019-05-31 16:57:59 -05:00
applyMovement: (vector) => {
this.appliedMovement = Vector.add(this.appliedMovement, vector);
},
forceMovement: (movement) => {
2019-03-23 18:26:35 -05:00
this.entity.x += movement[0];
this.entity.y += movement[1];
},
2019-03-17 23:45:48 -05:00
requestMovement: (vector) => {
if (!this.isMobile) {
return;
}
2019-05-31 16:57:59 -05:00
this.entity.applyMovement(Vector.scale(
Vector.normalize(vector),
2019-03-17 23:45:48 -05:00
this.speed
2019-05-31 16:57:59 -05:00
));
this.entity.emit('movementRequest', this.appliedMovement);
2019-03-17 23:45:48 -05:00
},
2019-03-20 19:31:35 -05:00
2019-03-17 23:45:48 -05:00
}
}
tick(elapsed) {
2019-05-31 16:57:59 -05:00
if (Vector.isZero(this.appliedMovement)) {
return;
}
if (this.entity.is('physical')) {
2019-05-31 16:57:59 -05:00
this.entity.applyImpulse(this.appliedMovement);
2019-03-17 23:45:48 -05:00
}
else {
2019-05-31 16:57:59 -05:00
const appliedMovement = Vector.scale(
this.appliedMovement,
elapsed
);
2019-05-31 16:57:59 -05:00
this.entity.forceMovement(appliedMovement);
}
2019-05-31 16:57:59 -05:00
this.appliedMovement = [0, 0];
2019-03-17 23:45:48 -05:00
}
}