UNPKG

tween24

Version:

Tween24.js is animation library that enables fast coding using method chains.

113 lines (93 loc) 3.08 kB
import { Tween24 } from "../Tween24"; export class Ticker24 { private _fps :number; private _timer :number; private _beforeTime :number; private _running :boolean; private _firstTween :Tween24|null; private _lastTween :Tween24|null; private _lastPlayTime:number; constructor() { this._fps = 0; this._timer = 0; this._beforeTime = 0; this._lastPlayTime = 0; this._running = false; this._firstTween = null; this._lastTween = null; } start() { this._running = true; this._timer = window.requestAnimationFrame(() => { this.update() }); } stop() { this._running = false; window.cancelAnimationFrame(this._timer); } add(tween:Tween24) { if (this._lastTween) { tween.__prev = this._lastTween; this._lastTween.__next = tween; } else { this._firstTween = tween; } this._lastTween = tween; if (!this._running) this.start(); } remove(tween:Tween24) { if (tween.__prev) tween.__prev.__next = tween.__next; if (tween.__next) tween.__next.__prev = tween.__prev; if (this._firstTween == tween) { this._firstTween = tween.__next; } if (this._lastTween == tween) { this._lastTween = tween.__prev; } tween.__prev = tween.__next = null; if (!this._firstTween) this.stop(); } update = () => { const nowTime = Ticker24.getTime(); let tickerCheck = true; if (this._fps) { tickerCheck = this._checkInterval(this._fps, this._beforeTime, nowTime); this._beforeTime = nowTime; } let tween = this._firstTween; while (tween) { const next = tween.__next; if (!tween.__fps) { if (tickerCheck) { tween.__update(nowTime); } } else if (this._checkInterval(tween.__fps, tween.__beforeTime, nowTime)) { tween.__update(nowTime); tween.__beforeTime = nowTime; } tween = next; } if (this._running) { this._timer = window.requestAnimationFrame(this.update); } } setPlayTIme():number { this._lastPlayTime = Ticker24.getTime(); return this._lastPlayTime; } getLastPLayTime = ():number => { return this._lastPlayTime; } set fps(value:number) { this._fps = value; } private _checkInterval(fps:number, beforeTime:number, nowTime:number):boolean { const interval:number = 1000 / fps; if (nowTime - beforeTime >= interval) return true; else return false; } static getTime():number { return Date.now() || new Date().getTime(); } }