123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- var easingFuncs = require("./easing");
- /**
- * 动画主控制器
- * @config target 动画对象,可以是数组,如果是数组的话会批量分发onframe等事件
- * @config life(1000) 动画时长
- * @config delay(0) 动画延迟时间
- * @config loop(true)
- * @config gap(0) 循环的间隔时间
- * @config onframe
- * @config easing(optional)
- * @config ondestroy(optional)
- * @config onrestart(optional)
- *
- * TODO pause
- */
- function Clip(options) {
- this._target = options.target; // 生命周期
- this._life = options.life || 1000; // 延时
- this._delay = options.delay || 0; // 开始时间
- // this._startTime = new Date().getTime() + this._delay;// 单位毫秒
- this._initialized = false; // 是否循环
- this.loop = options.loop == null ? false : options.loop;
- this.gap = options.gap || 0;
- this.easing = options.easing || 'Linear';
- this.onframe = options.onframe;
- this.ondestroy = options.ondestroy;
- this.onrestart = options.onrestart;
- this._pausedTime = 0;
- this._paused = false;
- }
- Clip.prototype = {
- constructor: Clip,
- step: function (globalTime, deltaTime) {
- // Set startTime on first step, or _startTime may has milleseconds different between clips
- // PENDING
- if (!this._initialized) {
- this._startTime = globalTime + this._delay;
- this._initialized = true;
- }
- if (this._paused) {
- this._pausedTime += deltaTime;
- return;
- }
- var percent = (globalTime - this._startTime - this._pausedTime) / this._life; // 还没开始
- if (percent < 0) {
- return;
- }
- percent = Math.min(percent, 1);
- var easing = this.easing;
- var easingFunc = typeof easing === 'string' ? easingFuncs[easing] : easing;
- var schedule = typeof easingFunc === 'function' ? easingFunc(percent) : percent;
- this.fire('frame', schedule); // 结束
- if (percent === 1) {
- if (this.loop) {
- this.restart(globalTime); // 重新开始周期
- // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件
- return 'restart';
- } // 动画完成将这个控制器标识为待删除
- // 在Animation.update中进行批量删除
- this._needsRemove = true;
- return 'destroy';
- }
- return null;
- },
- restart: function (globalTime) {
- var remainder = (globalTime - this._startTime - this._pausedTime) % this._life;
- this._startTime = globalTime - remainder + this.gap;
- this._pausedTime = 0;
- this._needsRemove = false;
- },
- fire: function (eventType, arg) {
- eventType = 'on' + eventType;
- if (this[eventType]) {
- this[eventType](this._target, arg);
- }
- },
- pause: function () {
- this._paused = true;
- },
- resume: function () {
- this._paused = false;
- }
- };
- var _default = Clip;
- module.exports = _default;
|