You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.2 KiB
147 lines
4.2 KiB
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;
|
|
|