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;
|