UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

98 lines 8.35 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9uLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udGV4dC9hbmltYXRpb24vYW5pbWF0aW9uLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQWlCdkMsTUFBTSxPQUFPLG1CQUFtQjtJQU81QixZQUE2QixPQUFtQjtRQUFuQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBSnhDLFNBQUksR0FBRyxDQUFDLENBQUE7UUFFQyxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUE7SUFFWixDQUFDO0lBRXJELFFBQVEsQ0FBQyxTQUF1QjtRQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7WUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLGdCQUFnQixtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFBO1FBQ3JGLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUE7UUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO1lBQzNCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtZQUNwQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQztZQUMzQixRQUFRLEVBQUUsUUFBUTtZQUNsQixlQUFlLEVBQUUsQ0FBQyxHQUFHLFFBQVE7WUFDN0IsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUNsRixJQUFJLEVBQUUsQ0FBQztZQUNQLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztZQUNuQixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDcEMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO1NBQ3pCLENBQUMsQ0FBQTtRQUNGLE9BQU8sU0FBUyxDQUFBO0lBQ3BCLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBdUI7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQix3QkFBd0I7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7WUFDbEMsQ0FBQztZQUNELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBO1lBQ3RDLElBQUksWUFBWSxHQUFHLENBQUM7Z0JBQUUsU0FBUTtZQUU5QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQyxDQUFBO1lBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7WUFDYixPQUFPLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztvQkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUE7b0JBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDcEIsMkRBQTJELEVBQzNELElBQUksRUFDSixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQzdCLENBQUEsQ0FBQywwREFBMEQ7b0JBQzVELE1BQUs7Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLENBQUM7b0JBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUE7Z0JBQ2xCLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsSUFBSSxDQUFDLENBQUE7b0JBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDckMsQ0FBQztnQkFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBQ1gsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNO29CQUFFLE1BQUs7Z0JBQ2xDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQTtZQUMvQixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1lBQ2pCLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sR0FBRyxZQUFZO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDO1lBQzFCLElBQUksRUFBRSxHQUFHLE9BQU8sWUFBWSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSztZQUNyRCxJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxNQUFNO1NBQ2hCLENBQUMsQ0FBQTtRQUNGLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUM5QixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7WUFDOUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUE7Z0JBQ3JCLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBO2dCQUN0QyxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTt3QkFDN0MsS0FBSyxFQUFFLE1BQU07cUJBQ2hCLENBQUMsQ0FBQTtnQkFDTixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUE7b0JBQ2hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtnQkFDekQsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDaEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNsQixDQUFDOztBQWpHYywyQkFBTyxHQUFHLENBQUMsQUFBSixDQUFJIn0=