效果都是根據以下測試代碼來說的,可能有些不太准確
setStartListener (const StartListener& listener)
StartListener原型
typedef std::function<void(int trackIndex)>StartListener;
效果:如果一個track中有兩個以上的動作,那么第二個以后的各個動作開始是會調用StartListener
setEndListener (const EndListener& listener)
EndListener原型
typedef std::function<void(int trackIndex)>EndListener;
效果:如果動畫只播放一次,那么播放結束先調用CompleteListener,然后調用EndListener
setCompleteListener (const CompleteListener& listener)
CompleteListener原型
typedef std::function<void(int trackIndex,int loopCount)>CompleteListener;
效果:如果動畫循環播放,那么每個循環結束都會調用CompleteListener這個函數
setEventListener(const EventListener& listener)
EventListener原型
typedef std::function<void(int trackIndex, spEvent* event)>EventListener;
效果:這個需要在spine里做動畫的時候在某一幀添加event時間,還沒有測試,先不多說
setTrackStartListener (spTrackEntry* entry, const StartListener& listener)
setTrackEndListener (spTrackEntry* entry, const EndListener& listener)
setTrackCompleteListener (spTrackEntry* entry, const CompleteListener& listener)
setTrackEventListener (spTrackEntry* entry, const EventListener& listener)
//add a spine animation
auto juese1 =SkeletonAnimation::createWithFile("juese1/juese1.json","juese1/juese1.atlas");
/************************************************************************/
/* 兩個都是true,第一個動畫播放一次,第二個動畫循環播放
/* 第一個true第二個false,兩個動畫都是只播放一次
/* 兩個都是false,兩個動畫都只播放一次
/* 第一個false第二個true,第一個動畫播放一次,第二個動畫循環播放
/* 總結:如果有兩個動畫,不管第一個動畫的循環是true還是false,都只播放一次,第二個動畫是true就循環是false就不循環
/* 如果有n(n > 2)個動畫,那么前(n - 1)個動畫的循環是不起作用的都是只播放一次,最后一個動畫的循環起作用
/************************************************************************/
juese1->setAnimation(0,"putonggongji",true);
juese1->addAnimation(0,"beiji",true);
juese1->addAnimation(0,"daiji",true);
juese1->setSkin("juese1");
juese1->setScale(0.7f);
juese1->setPosition(Vec2(450,200));
this->addChild(juese1);
juese1->setStartListener([=](int trackIndex){
auto entry = spAnimationState_getCurrent(juese1->getState(), trackIndex);
constchar* animationName =(entry && entry->animation)? entry->animation->name :0;
log("track start: %d, animation name: %s", trackIndex, animationName);
});
juese1->setEndListener([=](int trackIndex){
auto entry = spAnimationState_getCurrent(juese1->getState(), trackIndex);
constchar* animationName =(entry && entry->animation)? entry->animation->name :0;
log("track end: %d, animation name: %s", trackIndex, animationName);
});
juese1->setCompleteListener([=](int trackIndex,int loop){
auto entry = spAnimationState_getCurrent(juese1->getState(), trackIndex);
constchar* animationName =(entry && entry->animation)? entry->animation->name :0;
log("track complete: %d, loop: %d, animation name: %s", trackIndex, loop, animationName);
});
部分log輸出
track complete:0, loop:1, animation name: putonggongji
track end:0, animation name: putonggongji
track start:0, animation name: beiji
track complete:0, loop:1, animation name: beiji
track end:0, animation name: beiji
track start:0, animation name: daiji
track complete:0, loop:1, animation name: daiji
track complete:0, loop:2, animation name: daiji
track complete:0, loop:3, animation name: daiji
track complete:0, loop:4, animation name: daiji
track complete:0, loop:5, animation name: daiji
track complete:0, loop:6, animation name: daiji