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';
|
|
|
|
}
|
|
|
|
|
2019-05-06 04:03:43 -05:00
|
|
|
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) => {
|
2019-09-08 05:34:17 -05:00
|
|
|
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(
|
2019-03-27 17:53:18 -05:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-12 13:05:30 -05:00
|
|
|
tick(elapsed) {
|
2019-05-31 16:57:59 -05:00
|
|
|
if (Vector.isZero(this.appliedMovement)) {
|
2019-04-12 13:05:30 -05:00
|
|
|
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
|
|
|
}
|
2019-04-12 13:05:30 -05:00
|
|
|
else {
|
2019-05-31 16:57:59 -05:00
|
|
|
const appliedMovement = Vector.scale(
|
|
|
|
this.appliedMovement,
|
2019-04-12 13:05:30 -05:00
|
|
|
elapsed
|
|
|
|
);
|
2019-05-31 16:57:59 -05:00
|
|
|
this.entity.forceMovement(appliedMovement);
|
2019-04-12 13:05:30 -05:00
|
|
|
}
|
2019-05-31 16:57:59 -05:00
|
|
|
this.appliedMovement = [0, 0];
|
2019-03-17 23:45:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|