gibbon.js
Version:
Actor/Component system for use with pixi.js.
118 lines (95 loc) • 2.95 kB
text/typescript
import { Component } from '../core/component';
/**
* A Driver always moves without slipping
* in the direction of its orientation/angle.
* Driver is also a good approximation for
* walking/running characters.
*/
export class Driver extends Component {
/**
* @property {number} rotation - wraps actor rotation in radians.
*/
get rotation() { return this.actor!.rotation; }
set rotation(v) {
this.actor!.rotation = v;
}
/**
* @property position
*/
get position() { return this.actor!.position; }
set position(v) { this.actor!.position = v; }
/**
* @property velocity
*/
get speed() { return this._speed; }
set speed(v) { this._speed = v; }
/**
* @property {number} velocityMax - Maximum absolute value of velocity.
*/
get speedMax(): number { return this._speedMax; }
set speedMax(v: number) { this._speedMax = v; }
/**
* @property {number} omegaAcc
*/
get omegaAcc() { return this._omegaAcc; }
set omegaAcc(v) { this._omegaAcc = v; }
/**
* @property {number} omega - angular velocity in radians/frame.
*/
get omega() { return this._omega; }
set omega(v) { this._omega = v; }
/**
* @property {number} omegaMax
*/
get omegaMax() { return this._omegaMax; }
set omegaMax(v) { this._omegaMax = v; }
/**
* @property accel
*/
get accel(): number { return this._accel; }
set accel(v: number) {
this._accel = v;
}
/**
* @property {number} accelMax
*/
get accelMax() { return this._accelMax; }
set accelMax(v: number) { this._accelMax = v; }
/**
* Velocity is always along the orientation.
*/
private _speed: number = 0;
/**
* As the driver only moves in the direction of its
* orientation, acceleration is only a number.
*/
private _accel: number = 0;
private _speedMax: number = 4;
private _accelMax: number = 1;
private _omegaAcc: number = 0;
private _omega: number = 0;
private _omegaMax: number = Math.PI / 40;
init() {
}
update(delta: number) {
let angle = this.rotation;
this._omega += this._omegaAcc * delta;
if (this._omega > this._omegaMax) {
this._omega = this._omegaMax;
} else if (this._omega < -this._omegaMax) {
this._omega = -this._omegaMax;
}
angle += this._omega * delta;
this.rotation = angle;
const cos = Math.cos(angle);
const sin = Math.sin(angle);
this._speed += this._accel * delta;
if (this._speed > this._speedMax) {
this._speed = this._speedMax
} else if (this._speed < -this._speedMax) {
this._speed = -this._speedMax;
}
const pos = this.position;
pos.set(pos.x + cos * this._speed * delta, pos.y + sin * this._speed * delta);
}
}