本人最近学习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,大概就了解这么多,希望以后继续深入了解