CocosCreator提供了很方便的Spine动画接口,我们常常会在播放Spine动画完成后做一些处理,这就需要知道Spine动画播放完成的准确时机,CocosCreator官方Demo中示范的setStartListener、setEndListener等回调函数,虽然有效,但它只能访问到本Animation对象,而不能访问到脚本的this对象。
查看引擎源码发现,其实Spine接口还提供了一个设置回调的接口setAnimationListener,在这里可以处理所有动画事件,也能访问到this对象。
假设包含了Spine动画组件的节点名为spineNode,则可以先在start设置好回调,如下:
start () {
let spine = this.spineNode.getComponent('sp.Skeleton');
spine.setAnimationListener(this, this.spineEventCallback); // 设置回调
spine.setAnimation(0, 'run', false); // 播放名为run的动画
},
Spine动画事件的回调函数实现如下:
spineEventCallback: function(skeletonNode, trackEntry, eventType, event, loopCount) {
// 如果动画播放完成且名字等于run,做相应处理
if (eventType === sp.AnimationEventType.COMPLETE && trackEntry.animation && trackEntry.animation.name === 'run') {
this.node.destroy();
}
},
引擎中对Spine事件类型的定义如下:
sp.AnimationEventType = cc.Enum({
START: 0,
INTERRUPT: 1,
END: 2,
DISPOSE: 3,
COMPLETE: 4,
EVENT: 5
});
注:如果动画是循环的,则每完成一次循环都会触发COMPLETE。