Engine.SimpleTimer = class
{
constructor(time, callback, loop /* = false*/, useRealTime /* = false*/)
{
if (loop === undefined) loop = false;
if (useRealTime === undefined) useRealTime = false;
this.useRealTime = useRealTime;
this.hasTime = false;
this.t = 0;
this.tSeconds = 0;
this.active = false;
this.onUpdate = null;
this.onFinish = null;
this.onSecondsChanged = null;
this.timeScale = 1;
this.ignoreFirstUpdate = true;
this.duration = 0;
this.loop = loop ? loop : false;
this.pauseCount = 0;
if (time !== undefined && callback !== undefined)
{
this.start(time, callback, loop, this.useRealTime);
}
}
get timeLeft() { return this.t; }
get paused() { return this.pauseCount > 0;}
start(time, callback, loop /* = false*/, useRealTime /* = false*/)
{
if (loop === undefined) loop = false;
if (useRealTime === undefined) useRealTime = false;
this.useRealTime = useRealTime;
this.hasTime = true;
this.loop = loop;
this.onFinish = callback;
this.duration = time;
this.t = time;
this.setTSeconds();
Engine.EnterFrameManagerInstance.add(this, this.update, this.useRealTime);
this.active = true;
this.ignoreFirstUpdate = true;
}
setTSeconds()
{
var oldTSeconds = this.tSeconds;
this.tSeconds = Math.max(0, Math.ceil(this.t));
if (oldTSeconds != this.tSeconds && this.onSecondsChanged != null)
{
this.onSecondsChanged(this.tSeconds);
}
}
stop()
{
if (!this.active) return;
Engine.EnterFrameManagerInstance.remove(this);
this.active = false;
this.onFinish = null;
this.onUpdate = null;
}
pause()
{
if (!this.active) return;
this.pauseCount++;
if (this.pauseCount == 1)
{
Engine.EnterFrameManagerInstance.remove(this);
}
}
resume()
{
if (this.pauseCount == 0 || !this.hasTime) return;
this.pauseCount--;
if (this.pauseCount == 0)
{
Engine.EnterFrameManagerInstance.add(this, this.update, this.useRealTime);
}
}
setTime(t)
{
this.t = t;
this.setTSeconds();
}
addTime(a)
{
this.t += a;
this.setTSeconds();
}
update(timeElapsed)
{
if (this.ignoreFirstUpdate)
{
this.ignoreFirstUpdate = false;
return;
}
if (!this.active) return;
if (this.paused) return;
this.t -= (timeElapsed * this.timeScale);
this.setTSeconds();
if(this.onUpdate != null) this.onUpdate(this.duration - this.t);
if (this.t <= 0)
{
var actualTime = this.duration - this.t;
if (this.loop)
{
this.t += this.duration;
this.setTSeconds();
}
else
{
this.t = 0;
this.setTSeconds();
this.active = false;
Engine.EnterFrameManagerInstance.remove(this);
}
if (this.onFinish) this.onFinish();
}
}
}