@pixi/animate
Version:
PIXI plugin for the PixiAnimate Extension
1 lines • 6.4 kB
Source Map (JSON)
{"version":3,"file":"AnimatorTimeline.mjs","sources":["../../src/animate/AnimatorTimeline.ts"],"sourcesContent":["import type { MovieClip } from './MovieClip';\nimport { Animator } from './Animator';\n\nconst pool: AnimatorTimeline[] = [];\n\n/**\n * Represents a single animation play.\n */\nexport class AnimatorTimeline\n{\n /**\n * Bound copy of update().\n */\n private _update: (instance: MovieClip) => (() => void | null);\n\n /**\n * Instance of clip to play.\n * @readOnly\n */\n public instance: MovieClip;\n\n /**\n * `true` if the timeline is suppose to loop.\n * @readOnly\n */\n public loop: boolean;\n\n /**\n * Frame number of the starting farme.\n * @readOnly\n */\n public start: number;\n\n /**\n * Frame number of the ending frame.\n * @readOnly\n */\n public end: number;\n\n /**\n * Callback called when completed (non-looping animation).\n * @readOnly\n */\n public callback: () => void;\n\n constructor()\n {\n this._update = this.update.bind(this);\n this.init(null, 0, 0, false, null);\n }\n\n /**\n * The pool of timelines to use\n * @param instance\n * @param start\n * @param end\n * @param loop\n * @param callback\n */\n private init(instance: MovieClip, start: number, end: number, loop: boolean, callback: () => void): void\n {\n this.instance = instance;\n this.loop = loop;\n this.start = start;\n this.end = end;\n this.callback = callback;\n\n if (instance)\n {\n // Prevent overshooting the end frame and looping back around:\n instance.loop = false;\n instance.gotoAndStop(start);\n instance._beforeUpdate = this._update;\n }\n }\n\n /**\n * Don't use after this\n * @private\n */\n destroy(): void\n {\n this.instance._beforeUpdate = null;\n this.init(null, 0, 0, false, null);\n AnimatorTimeline._pool.push(this);\n }\n\n /**\n * Is the animation complete\n * @param instance\n * @return Callback to do after updateTimeline\n * @private\n */\n update(instance: MovieClip): (() => void) | null\n {\n let completed: () => void;\n\n if (instance.currentFrame >= this.end)\n {\n // In case we over-shoot the current frame becuase of low FPS\n instance.currentFrame = this.end;\n\n if (this.loop)\n {\n // Update timeline so we get actions at the end frame\n instance._updateTimeline();\n instance.gotoAndPlay(this.start);\n }\n else\n {\n instance.stop();\n if (this.callback)\n {\n completed = this.callback;\n }\n this.stop(); // cleanup timeline\n }\n }\n\n return completed;\n }\n\n /**\n * Stop the animation, cannot be reused.\n */\n stop(): void\n {\n Animator._internalStop(this);\n }\n\n /**\n * The progress from 0 to 1 of the playback.\n */\n get progress(): number\n {\n const progress = (this.instance.currentFrame - this.start) / (this.end - this.start);\n\n return Math.max(0, Math.min(1, progress)); // clamp\n }\n\n /**\n * The pool of timelines to use\n * @private\n */\n static get _pool(): AnimatorTimeline[]\n {\n return pool;\n }\n\n /**\n * Create a new timeline\n */\n static create(instance: MovieClip, start: number, end: number, loop: boolean, callback: () => void): AnimatorTimeline\n {\n let timeline: AnimatorTimeline;\n\n if (this._pool.length)\n {\n timeline = this._pool.pop();\n }\n else\n {\n timeline = new AnimatorTimeline();\n }\n timeline.init(instance, start, end, loop, callback);\n\n return timeline;\n }\n}\n"],"names":[],"mappings":"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"}