spacekitcat/hackertextjs

View on GitHub
src/AnimationScheduler.js

Summary

Maintainability
A
0 mins
Test Coverage
define('AnimationScheduler', ['Widget'], Widget =>
class AnimationSchedular {
constructor() {
this.painters = [];
this.painterFps = [];
this.then = null;
}
 
addPainter(framePainter, frameRate) {
if (framePainter === undefined || framePainter === null) {
throw new TypeError('Widget instance must be provided.');
}
 
if (!(framePainter instanceof Widget)) {
throw new TypeError('first argument must be an instance of Widget.');
}
 
if (frameRate === undefined || frameRate === null) {
throw new TypeError('frameRate value must be provided.');
}
 
// Warn: Little weak design wise, but it's simple
this.painters.push(framePainter);
this.painterFps.push({ framerate: frameRate, then: 0, elapsed: 0 });
}
 
getPainters() {
return this.painters;
}
 
step(timestamp) {
TODO found
// TODO: This can be written more clearly.
for (let i = 0; i < this.painters.length; i += 1) {
const { framerate } = this.painterFps[i];
const { then } = this.painterFps[i];
let { elapsed } = this.painterFps[i];
 
elapsed = timestamp - then;
if (elapsed >= 1000 / framerate) {
this.painterFps[i].then = timestamp - elapsed % framerate;
this.painters[i].paint();
}
this.painterFps[i].elapsed = elapsed;
}
 
window.requestAnimationFrame(this.step.bind(this));
}
 
init() {
for (let i = 0; i < this.painters.length; i += 1) {
this.painters[i].paint();
}
}
 
start() {
if (this.painters.length > 0) {
this.init();
window.requestAnimationFrame(this.step.bind(this));
}
}
});