src/modules/animation/index.js
import BaseSprite from '../../core/basesprite';
import Animation from './animation';
Object.assign(BaseSprite.prototype, {
animate(frames, timing, isStyleAnim = false) {
let setter = null;
if(isStyleAnim) {
setter = (frame, target) => {
target.__attr.__styleTag = true;
target.attr(frame);
target.__attr.__styleTag = false;
};
}
const animation = new Animation(this, frames, timing, setter);
if(this.effects) animation.applyEffects(this.effects);
if(this.layer) {
animation.baseTimeline = this.layer.timeline;
animation.play();
animation.finished.then(() => {
this.animations.delete(animation);
});
}
this.animations.add(animation);
return animation;
},
transition(sec, easing = 'linear', isStyleAnim = false) {
const that = this,
_animation = Symbol('animation');
easing = easing || 'linear';
let delay = 0;
if(typeof sec === 'object') {
delay = sec.delay || 0;
sec = sec.duration;
}
return {
[_animation]: null,
cancel(preserveState = false) {
const animation = this[_animation];
if(animation) {
animation.cancel(preserveState);
}
},
end() {
const animation = this[_animation];
if(animation && (animation.playState === 'running' || animation.playState === 'pending')) {
animation.finish();
}
},
reverse() {
const animation = this[_animation];
if(animation) {
if(animation.playState === 'running' || animation.playState === 'pending') {
animation.playbackRate = -animation.playbackRate;
} else {
const direction = animation.timing.direction;
animation.timing.direction = direction === 'reverse' ? 'normal' : 'reverse';
animation.play();
}
}
return animation.finished;
},
attr(prop, val) {
this.end();
if(typeof prop === 'string') {
prop = {[prop]: val};
}
Object.entries(prop).forEach(([key, value]) => {
if(typeof value === 'function') {
prop[key] = value(that.attr(key));
}
});
this[_animation] = that.animate([prop], {
duration: sec * 1000,
delay: delay * 1000,
fill: 'forwards',
easing,
}, isStyleAnim);
return this[_animation].finished;
},
};
},
});