phaser4-rex-plugins
Version:
144 lines (120 loc) • 3.92 kB
JavaScript
import TickTask from '../../utils/componentbase/SceneUpdateTickTask.js';
const GetValue = Phaser.Utils.Objects.GetValue;
const DistanceBetween = Phaser.Math.Distance.Between;
const Lerp = Phaser.Math.Linear;
const AngleBetween = Phaser.Math.Angle.Between;
class MoveTo extends TickTask {
constructor(gameObject, config) {
super(gameObject, config);
// this.parent = gameObject;
this.resetFromJSON(config);
this.boot();
}
resetFromJSON(o) {
this.isRunning = GetValue(o, 'isRunning', false);
this.setEnable(GetValue(o, 'enable', true));
this.timeScale = GetValue(o, 'timeScale', 1);
this.setSpeed(GetValue(o, 'speed', 400));
this.setRotateToTarget(GetValue(o, 'rotateToTarget', false));
this.targetX = GetValue(o, 'targetX', 0);
this.targetY = GetValue(o, 'targetY', 0);
return this;
}
toJSON() {
return {
isRunning: this.isRunning,
enable: this.enable,
timeScale: this.timeScale,
speed: this.speed,
rotateToTarget: this.rotateToTarget,
targetX: this.targetX,
targetY: this.targetY,
tickingMode: this.tickingMode
};
}
setEnable(e) {
if (e == undefined) {
e = true;
}
this.enable = e;
return this;
}
setSpeed(speed) {
this.speed = speed;
return this;
}
setRotateToTarget(rotateToTarget) {
this.rotateToTarget = rotateToTarget;
return this;
}
moveTo(x, y) {
if (typeof (x) !== 'number') {
var config = x;
x = config.x;
y = config.y;
}
this.targetX = x;
this.targetY = y;
super.start();
this.emit('start', this.parent, this);
return this;
}
moveFrom(x, y) {
if (typeof (x) !== 'number') {
var config = x;
x = config.x;
y = config.y;
}
var gameObject = this.parent;
var targetX = gameObject.x;
var targetY = gameObject.y;
gameObject.setPosition(x, y);
this.moveTo(targetX, targetY);
return this;
}
moveToward(angle, distance) {
var gameObject = this.parent;
var targetX = gameObject.x + Math.cos(angle) * distance;
var targetY = gameObject.y + Math.sin(angle) * distance;
this.moveTo(targetX, targetY);
return this;
}
update(time, delta) {
if ((!this.isRunning) || (!this.enable)) {
return this;
}
var gameObject = this.parent;
if (!gameObject.active) {
return this;
}
var curX = gameObject.x,
curY = gameObject.y;
var targetX = this.targetX,
targetY = this.targetY;
if ((curX === targetX) && (curY === targetY)) {
this.complete();
return this;
}
if ((this.speed === 0) || (delta === 0) || (this.timeScale === 0)) {
return this;
}
var dt = (delta * this.timeScale) / 1000;
var movingDist = this.speed * dt;
var distToTarget = DistanceBetween(curX, curY, targetX, targetY);
var newX, newY;
if (movingDist < distToTarget) {
var t = movingDist / distToTarget;
newX = Lerp(curX, targetX, t);
newY = Lerp(curY, targetY, t);
} else {
newX = targetX;
newY = targetY;
}
gameObject.setPosition(newX, newY);
if (this.rotateToTarget) {
gameObject.rotation = AngleBetween(curX, curY, newX, newY);
}
return this;
}
}
export default MoveTo;