UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

129 lines 8.74 kB
/** * 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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