quick3.3导入Spine骨骼动画并注册帧事件

本人最近学习quick3.3中的spine骨骼动画如何使用,初来乍道,记录笔记,以免遗忘!总结出来,以免和我一样的新手走弯路

 cc.FileUtils:getInstance():addSearchPath("res/spine")  --添加资源路径

 self.skeleteonNode = sp.SkeletonAnimation:create("spineboy.json","spineboy.atlas",1.5)  --获取资源数据(这是本人的理解,理解为root),第三个参数为缩放参数
 
self.skeleteonNode:setAnimation(0,"run",false)   --这个方法可以播放第二个参数名的动画,第三个参数代表是否循环播放,false为播放一次

 self.skeleteonNode:setMix("run", "walk", 0.2)  --这个说是对两个动作进行衔接,可以是衔接平滑(我没仔细看她,没有看到效果)

 self.skeleteonNode:addAnimation(0, "walk", true)  --这个是添加动作,我看到的效果就是播放完  run  就立刻播放  walk 

self.skeleteonNode:setScale(0.3)  --这个表示大小缩放

 self.skeleteonNode:setTimeScale(2)  --这个对播放动画的时间进行缩放控制

 self.skeleteonNode:pause()  --暂停播放

 self.skeleteonNode:resume()  --继续播放



```


割--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面就进行骨骼帧事件的注册了:

self.skeleteonNode:registerSpineEventHandler(function(event)    --通过registerSpineEventHandler这个方法注册
 dump(event)
 if event.animation == "run" then  --根据动作名来区分
     print("Run")
     if event.eventData.name == "footStep" then  --根据帧事件来区分
          print("在这一帧放大招")
     end
 elseif event.animation == "walk" then
    print("walk")
  end
 end,sp.EventType.ANIMATION_EVENT)  --注意:这里sp.EventType.ANIMATION_EVENT是个枚举,共有4个本别是sp.EventType.ANIMATION_START = 0,
                                                                              --sp.EventType.ANIMATION_END = 1, sp.EventType.ANIMATION_COMPLETE = 2,sp.EventType.ANIMATION_EVENT = 3


```



这里遇到一个蛋疼的问题,因为我的素材中没有在spine中添加帧事件,所以只有sp.EventType.ANIMATION_END和sp.EventType.ANIMATION_COMPLETE时,才能进入上面function(event)这个方法中,所以一定要确定
好素材正确,但是由于这个问题,我就去看源码,找到了其中关于event,即function中参数有哪些:

----   ---[frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\spine是tolua的路径
 LuaValueDict spineEvent;
    spineEvent.insert(spineEvent.end(), LuaValueDict::value_type("type", LuaValue::stringValue(eventTypeName)));           --type有4个类型,就是上面提到的枚举
    spineEvent.insert(spineEvent.end(), LuaValueDict::value_type("trackIndex", LuaValue::intValue(trackIndex)));                --trackIndex就是setAnimation(0,"run",false)这里第一个参数
    spineEvent.insert(spineEvent.end(), LuaValueDict::value_type("animation", LuaValue::stringValue(animationName)));    --animation为动作名
    spineEvent.insert(spineEvent.end(), LuaValueDict::value_type("loopCount", LuaValue::intValue(loopCount)));                 --loopCount为循环播放的次数
    
    if (nullptr != event)  --当有帧事件,就会进入到这个判断中
    {
        LuaValueDict eventData;
        eventData.insert(eventData.end(), LuaValueDict::value_type("name", LuaValue::stringValue(event->data->name)));
        eventData.insert(eventData.end(), LuaValueDict::value_type("intValue", LuaValue::intValue(event->intValue)));
        eventData.insert(eventData.end(), LuaValueDict::value_type("floatValue", LuaValue::floatValue(event->floatValue)));
        eventData.insert(eventData.end(), LuaValueDict::value_type("stringValue", LuaValue::stringValue(event->stringValue)));
        spineEvent.insert(spineEvent.end(), LuaValueDict::value_type("eventData", LuaValue::dictValue(eventData)));
    }
--]]


```


最后:如何取消注册spine事件的监听呢,我想用spine:unregisterSpineEventHandler()这个方法,但是发现不管事,问了一个人,他说他就直接remove  Spine这个对象,好吧,那我也这样做,但是
又发现了一个问题,就是remove这个动作不能在registerSpineEventHandler(function(event)    end,3)  这个方法中去操作,如果写这里就会没有效果,有人说在这里写会影响后续动作,但是为什么不管事就不知道什么原因了
在其他地方调用spine:removeFromParent()这个方法就删除这个spine了

ok,大概就了解这么多,希望以后继续深入了解