@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
98 lines • 8.35 kB
JavaScript
import { TgdConsole } from "./../../debug/index.js";
export class TgdManagerAnimation {
constructor(context) {
this.context = context;
this.time = 0;
this.animations = new Map();
}
schedule(animation) {
if (!animation.name)
animation.name = `TgdAnimation#${TgdManagerAnimation.counter++}`;
const { action, duration, easingFunction, repeat } = animation;
this.animations.set(animation, {
name: animation.name,
start: -1,
delay: animation.delay ?? 0,
duration: duration,
inverseDuration: 1 / duration,
action: easingFunction ? (alpha) => action(easingFunction(alpha)) : action,
loop: 1,
repeat: repeat ?? 1,
cancel: () => this.cancel(animation),
onEnd: animation.onEnd,
});
return animation;
}
cancel(animation) {
this.animations.delete(animation);
}
paint(time) {
if (this.animations.size === 0)
return false;
this.time = time;
for (const anim of this.animations.values()) {
if (anim.start < 0) {
// Initialize animation.
anim.start = time + anim.delay;
}
const relativeTime = time - anim.start;
if (relativeTime < 0)
continue;
const t = Math.min(1, anim.inverseDuration * relativeTime);
anim.action(t);
let loops = 0;
while (time > anim.start + anim.duration) {
if (loops++ > 10) {
this.context.console.log("Too many loops for", anim);
this.context.console.log("🚀 [animation-manager] time, anim.start + anim.duration =", time, anim.start + anim.duration); // @FIXME: Remove this line written on 2025-11-06 at 10:52
break;
}
try {
anim.onEnd?.();
}
catch (error) {
this.context.console.error("Animation.onEnd() failed for", anim);
this.context.console.error(error);
}
anim.loop++;
if (anim.loop > anim.repeat)
break;
anim.start += anim.duration;
}
if (anim.loop > anim.repeat) {
anim.cancel();
}
}
return true;
}
debug(caption = "Animations") {
const output = new TgdConsole({
text: `${caption} (count: ${this.animations.size})\n`,
bold: true,
color: "#fa0",
});
for (const anim of this.animations.values()) {
output.add(anim.name).add(" ");
if (anim.start < 0) {
output.add("Scheduled", { color: "#05b" });
}
else {
const { time } = this;
const relativeTime = time - anim.start;
if (relativeTime < 0) {
output.add(`Wait ${Math.abs(relativeTime)} sec`, {
color: "#d00",
});
}
else {
const t = Math.min(1, anim.inverseDuration * relativeTime) * 100;
output.add(`Run ${t.toFixed(0)}%`, { color: "#0d0" });
}
}
output.add();
}
output.debug();
}
}
TgdManagerAnimation.counter = 1;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9uLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udGV4dC9hbmltYXRpb24vYW5pbWF0aW9uLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQWlCdkMsTUFBTSxPQUFPLG1CQUFtQjtJQU81QixZQUE2QixPQUFtQjtRQUFuQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBSnhDLFNBQUksR0FBRyxDQUFDLENBQUE7UUFFQyxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUE7SUFFWixDQUFDO0lBRXJELFFBQVEsQ0FBQyxTQUF1QjtRQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7WUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLGdCQUFnQixtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFBO1FBQ3JGLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUE7UUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO1lBQzNCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtZQUNwQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQztZQUMzQixRQUFRLEVBQUUsUUFBUTtZQUNsQixlQUFlLEVBQUUsQ0FBQyxHQUFHLFFBQVE7WUFDN0IsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUNsRixJQUFJLEVBQUUsQ0FBQztZQUNQLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztZQUNuQixNQUFNLEVBQUUsR0FBRyxF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