148 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import { __extends } from "tslib";
 | |
| import Eventful from '../core/Eventful.js';
 | |
| import requestAnimationFrame from './requestAnimationFrame.js';
 | |
| import Animator from './Animator.js';
 | |
| export function getTime() {
 | |
|     return new Date().getTime();
 | |
| }
 | |
| var Animation = (function (_super) {
 | |
|     __extends(Animation, _super);
 | |
|     function Animation(opts) {
 | |
|         var _this = _super.call(this) || this;
 | |
|         _this._running = false;
 | |
|         _this._time = 0;
 | |
|         _this._pausedTime = 0;
 | |
|         _this._pauseStart = 0;
 | |
|         _this._paused = false;
 | |
|         opts = opts || {};
 | |
|         _this.stage = opts.stage || {};
 | |
|         return _this;
 | |
|     }
 | |
|     Animation.prototype.addClip = function (clip) {
 | |
|         if (clip.animation) {
 | |
|             this.removeClip(clip);
 | |
|         }
 | |
|         if (!this._head) {
 | |
|             this._head = this._tail = clip;
 | |
|         }
 | |
|         else {
 | |
|             this._tail.next = clip;
 | |
|             clip.prev = this._tail;
 | |
|             clip.next = null;
 | |
|             this._tail = clip;
 | |
|         }
 | |
|         clip.animation = this;
 | |
|     };
 | |
|     Animation.prototype.addAnimator = function (animator) {
 | |
|         animator.animation = this;
 | |
|         var clip = animator.getClip();
 | |
|         if (clip) {
 | |
|             this.addClip(clip);
 | |
|         }
 | |
|     };
 | |
|     Animation.prototype.removeClip = function (clip) {
 | |
|         if (!clip.animation) {
 | |
|             return;
 | |
|         }
 | |
|         var prev = clip.prev;
 | |
|         var next = clip.next;
 | |
|         if (prev) {
 | |
|             prev.next = next;
 | |
|         }
 | |
|         else {
 | |
|             this._head = next;
 | |
|         }
 | |
|         if (next) {
 | |
|             next.prev = prev;
 | |
|         }
 | |
|         else {
 | |
|             this._tail = prev;
 | |
|         }
 | |
|         clip.next = clip.prev = clip.animation = null;
 | |
|     };
 | |
|     Animation.prototype.removeAnimator = function (animator) {
 | |
|         var clip = animator.getClip();
 | |
|         if (clip) {
 | |
|             this.removeClip(clip);
 | |
|         }
 | |
|         animator.animation = null;
 | |
|     };
 | |
|     Animation.prototype.update = function (notTriggerFrameAndStageUpdate) {
 | |
|         var time = getTime() - this._pausedTime;
 | |
|         var delta = time - this._time;
 | |
|         var clip = this._head;
 | |
|         while (clip) {
 | |
|             var nextClip = clip.next;
 | |
|             var finished = clip.step(time, delta);
 | |
|             if (finished) {
 | |
|                 clip.ondestroy();
 | |
|                 this.removeClip(clip);
 | |
|                 clip = nextClip;
 | |
|             }
 | |
|             else {
 | |
|                 clip = nextClip;
 | |
|             }
 | |
|         }
 | |
|         this._time = time;
 | |
|         if (!notTriggerFrameAndStageUpdate) {
 | |
|             this.trigger('frame', delta);
 | |
|             this.stage.update && this.stage.update();
 | |
|         }
 | |
|     };
 | |
|     Animation.prototype._startLoop = function () {
 | |
|         var self = this;
 | |
|         this._running = true;
 | |
|         function step() {
 | |
|             if (self._running) {
 | |
|                 requestAnimationFrame(step);
 | |
|                 !self._paused && self.update();
 | |
|             }
 | |
|         }
 | |
|         requestAnimationFrame(step);
 | |
|     };
 | |
|     Animation.prototype.start = function () {
 | |
|         if (this._running) {
 | |
|             return;
 | |
|         }
 | |
|         this._time = getTime();
 | |
|         this._pausedTime = 0;
 | |
|         this._startLoop();
 | |
|     };
 | |
|     Animation.prototype.stop = function () {
 | |
|         this._running = false;
 | |
|     };
 | |
|     Animation.prototype.pause = function () {
 | |
|         if (!this._paused) {
 | |
|             this._pauseStart = getTime();
 | |
|             this._paused = true;
 | |
|         }
 | |
|     };
 | |
|     Animation.prototype.resume = function () {
 | |
|         if (this._paused) {
 | |
|             this._pausedTime += getTime() - this._pauseStart;
 | |
|             this._paused = false;
 | |
|         }
 | |
|     };
 | |
|     Animation.prototype.clear = function () {
 | |
|         var clip = this._head;
 | |
|         while (clip) {
 | |
|             var nextClip = clip.next;
 | |
|             clip.prev = clip.next = clip.animation = null;
 | |
|             clip = nextClip;
 | |
|         }
 | |
|         this._head = this._tail = null;
 | |
|     };
 | |
|     Animation.prototype.isFinished = function () {
 | |
|         return this._head == null;
 | |
|     };
 | |
|     Animation.prototype.animate = function (target, options) {
 | |
|         options = options || {};
 | |
|         this.start();
 | |
|         var animator = new Animator(target, options.loop);
 | |
|         this.addAnimator(animator);
 | |
|         return animator;
 | |
|     };
 | |
|     return Animation;
 | |
| }(Eventful));
 | |
| export default Animation;
 |