添加Spine动画需要用到 SkeletonAnimation 它相当于Node
所以它的使用就和使用Sprite一样
m_skeletonNode = SkeletonAnimation::createWithFile("spine/spineboy.json", "spine/spineboy.atlas");
m_skeletonNode->setMix("walk", "jump", 0.2f); // 混合动作,第三个参数是混合动画的时间
//m_skeletonNode->setMix("jump", "walk", 0.4f);
m_skeletonNode->setAnimation(0, "walk", false); // 设置动画walk,第一个参数为优先级,越高越先
m_skeletonNode->addAnimation(0, "jump", false/*, 3.f*/); // 添加动画jump, 第四个参数是延迟
m_skeletonNode->timeScale = 0.3f; // 动画速度变缓
m_skeletonNode->debugBones = true; // 打开骨骼调试
m_skeletonNode->setPosition(winSize.width/2, winSize.height/2);
this->addChild(m_skeletonNode);
动作状态事件的添加:
m_skeletonNode->setAnimationListener(this, animationStateEvent_selector(SpineTestLayer::animationStateEvent));
回调函数如下:
void SpineTestLayer::animationStateEvent( spine::SkeletonAnimation *node, int trackIndex, spEventType type, spEvent* event, int loopCount )
{
spTrackEntry* entry = spAnimationState_getCurrent(node->state, trackIndex);
const char* animationName = (entry && entry->animation) ? entry->animation->name : 0;
switch (type) {
case ANIMATION_START:
log("%d start: %s", trackIndex, animationName);
break;
case ANIMATION_END:
log("%d end: %s", trackIndex, animationName);
break;
case ANIMATION_COMPLETE:
log("%d complete: %s, %d", trackIndex, animationName, loopCount);
break;
case ANIMATION_EVENT:
log("%d event: %s, %s: %d, %f, %s", trackIndex, animationName, event->data->name, event->intValue, event->floatValue, event->stringValue);
break;
}
}