@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
129 lines • 8.74 kB
JavaScript
/**
* Use this class to abstract the time given by a `TgdContext`.
*/
export class TgdTime {
constructor({ speed = 1, context } = {}) {
/**
* Multiply the real time by this factor.
*/
this._speed = 1;
this.playing = false;
this.timeStart = 0;
this.timeStop = 0;
this.secondsAtSpeedZero = 0;
this.speedAtPause = 0;
this.firstUpdate = true;
this.context = undefined;
this.actualUpdate = (context) => {
const { time } = this;
const { playing } = context;
if (this.firstUpdate) {
this.firstUpdate = false;
this.timeStart = time;
this.timeStop = time;
this.playing = playing;
return;
}
if (playing !== this.playing) {
if (playing) {
// Play
const { speed, speedAtPause, timeStart, timeStop } = this;
if (speedAtPause === 0) {
if (speed !== 0) {
this.timeStart = time - this.secondsAtSpeedZero / speed;
}
}
else if (speed === 0) {
this.secondsAtSpeedZero = (timeStop - timeStart) * speedAtPause;
}
else {
this.timeStart = time + ((timeStart - timeStop) * speedAtPause) / speed;
}
}
else {
// Pause
this.speedAtPause = this.speed;
this.timeStop = time;
}
this.playing = playing;
}
};
this._speed = speed;
this.speedAtPause = speed;
this.context = context;
this.bind(context);
}
get speed() {
return this._speed;
}
set speed(speed) {
if (this._speed === speed)
return;
if (this.playing) {
// Changing speed during playing should not make the time jump.
// These calculations make sure of that.
const { seconds } = this;
if (speed === 0)
this.secondsAtSpeedZero = seconds;
else if (this._speed === 0) {
this.timeStart = this.time - this.secondsAtSpeedZero / speed;
}
else {
this.timeStart = this.time - seconds / speed;
}
}
this._speed = speed;
}
get seconds() {
const { speed, timeStart, timeStop } = this;
if (speed === 0)
return this.secondsAtSpeedZero;
if (this.playing) {
return (this.time - timeStart) * speed;
}
return (timeStop - timeStart) * speed;
}
set seconds(seconds) {
if (this.speed === 0)
return;
const delta = this.seconds - seconds;
this.timeStart += delta / this.speed;
}
get milliseconds() {
return this.seconds * 1e3;
}
set milliseconds(milliseconds) {
this.seconds = milliseconds * 1e-3;
}
/**
* If you bind to a context, you don't need to call `update()` yourself,
* because it will be called automatically at every repaint.
*/
bind(context) {
this.unbind();
if (context) {
this.context = context;
context.eventPaintEnter.addListener(this.actualUpdate);
}
}
unbind() {
const { context } = this;
if (!context)
return;
context.eventPaintEnter.removeListener(this.actualUpdate);
this.context = undefined;
}
reset() {
this.firstUpdate = true;
}
update(context) {
// Manual updates are ignored when already bound to a context.
if (this.context)
return;
this.actualUpdate(context);
}
get time() {
return Date.now() * 1e-3;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90aW1lL3RpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0E7O0dBRUc7QUFDSCxNQUFNLE9BQU8sT0FBTztJQWlCaEIsWUFBWSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxLQUE4QixFQUFFO1FBaEJoRTs7V0FFRztRQUNLLFdBQU0sR0FBRyxDQUFDLENBQUE7UUFDVixZQUFPLEdBQUcsS0FBSyxDQUFBO1FBQ2YsY0FBUyxHQUFHLENBQUMsQ0FBQTtRQUNiLGFBQVEsR0FBRyxDQUFDLENBQUE7UUFDWix1QkFBa0IsR0FBRyxDQUFDLENBQUE7UUFDdEIsaUJBQVksR0FBRyxDQUFDLENBQUE7UUFDaEIsZ0JBQVcsR0FBRyxJQUFJLENBQUE7UUFDbEIsWUFBTyxHQUlHLFNBQVMsQ0FBQTtRQTRGVixpQkFBWSxHQUFHLENBQUMsT0FBNkIsRUFBRSxFQUFFO1lBQzlELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUE7WUFDckIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQTtZQUMzQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO2dCQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7Z0JBQ3RCLE9BQU07WUFDVixDQUFDO1lBQ0QsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMzQixJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNWLE9BQU87b0JBQ1AsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQTtvQkFDekQsSUFB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