个别本地代码可能编不过去,自己改一下吧
--- 骨骼动画包装器 -- 建议最多包括2级嵌套动画 local Animation = {} Animation.Z_ORDER_UPDATED = 0 Animation.ANIMATION_FRAME_EVENT = 1 Animation.BONE_FRAME_EVENT = 2 Animation.SOUND = 3 Animation.FADE_IN = 4 Animation.FADE_OUT = 5 Animation.START = 6 Animation.COMPLETE = 7 Animation.LOOP_COMPLETE = 8 Animation.FADE_IN_COMPLETE = 9 Animation.FADE_OUT_COMPLETE = 10 Animation._ERROR = 11 --- 创建一个动画并返回 -- @string fileName 动画名 -- @string armatureName 骨架名 -- @return NodeAni function Animation.node(fileName, armatureName) return require("cola.ui.NodeAni").new(fileName, armatureName) end --- 删除已加载的指定名字的动画资源缓存 -- @string fileName 文件名 function Animation.removeRes(fileName) local factory = db.DBCCFactory:getInstance() local textureName = Animation.getTexturePng(fileName) factory:removeDragonBonesData(fileName) factory:removeTextureAtlas(fileName) --cocos2dx又换存了一次 需要清空否则 图片纹理不回收 实测 TextureCache:removeTextureForKey(textureName) end --- 清空所有加载过的Ani资源 -- 全部卸载干净 一般用于游戏热更新后重启 function Animation.removeAllRes() local factory = db.DBCCFactory:getInstance() factory:dispose(true) end --- 返回指定名字的动画骨架XML -- @string fileName 文件名 function Animation.getSkeletonXml(fileName) return "res/ani/" .. fileName .. "/skeleton.xml" end --- 返回指定名字的动画图片XML -- @string fileName 文件名 function Animation.getTextureXml(fileName) return "res/ani/" .. fileName .. "/texture.xml" end --- 返回指定名字的动画图片png -- @string fileName 文件名 function Animation.getTexturePng(fileName) return "res/ani/" .. fileName .. "/texture.png" end return Animation
--- 动画封装node
-- 基于dragonbones开源骨骼框架 -- 建议嵌套子动画不要超过2级 local NodeAni = class("NodeAni", function(...) return d.node() end) --- 构造方法 -- @string fileName 文件名 -- @string armatureName 骨架名 function NodeAni:ctor(fileName, armatureName) self.__fileName = fileName local factory = db.DBCCFactory:getInstance() self.__factory = factory local skeletonName = Animation.getSkeletonXml(fileName) local textureName = Animation.getTextureXml(fileName) factory:loadDragonBonesData(skeletonName, fileName) factory:loadTextureAtlas(textureName, fileName) if (armatureName) then self:setArmatureName(armatureName) end end --- 播放指定动作的动画 -- @string actionName 动作名 默认值为"a" -- @treturn self function NodeAni:play(actionName) assert(self.__armature, "@NodeAni play error! must setArmatureName first!!") self.__actionName = actionName or "a" self.__armature:getAnimation():gotoAndPlay(self.__actionName) return self end --- 停止动画并恢复到初始状态 -- @treturn self function NodeAni:stop() assert(self.__armature, "@NodeAni play error! must setArmatureName first!!") if self.__actionName then self.__armature:getAnimation():gotoAndStop(self.__actionName, 0, 0) end return self end --- 设置动画结束时执行回调方法 -- 循环动画不会触发回调 -- @func func 结束时回调方法 -- @treturn self function NodeAni:setEnded(func) self.__endedFunc = func self:_registerAnimationEvent() return self end --- 移除动画结束时的回调方法 -- @treturn self function NodeAni:removeEnded() self.__endedFunc = nil return self end --- 设置循环动画时每一次结束时的回调方法 -- 非循环动画不会触发回调, 循环动画回调会触发多次 -- @func func 每一次结束时回调方法 -- @treturn self function NodeAni:setLoopEnded(func) self.__loopEndedFunc = func self:_registerAnimationEvent() return self end --- 移除循环动画每一次结束时的回调方法 -- @treturn self function NodeAni:removeLoopEnded() self.__loopEndedFunc = nil return self end --- 设置骨架 -- @string armatureName 骨架名字 -- @treturn self function NodeAni:setArmatureName(armatureName) if (self.__armature) then self.__armature:removeFromParent() self.__armature = nil end self.__armatureName = armatureName local armature = self.__factory:buildArmatureNode(armatureName):addTo(self) self.__armature = armature return self end --- 设置骨骼所在的节点为新的node -- @string boneName 骨骼名字 -- @tparam cc.Node node 新的node -- @treturn self function NodeAni:setBoneNode(boneName, node) assert(self.__armature and boneName and node, "@NodeAni setBoneNode error!") local slot = self.__armature:getCCSlot(boneName) local oldDisplay = slot:getCCDisplay() local anchorPoint if (oldDisplay) then anchorPoint = oldDisplay:getAnchorPoint() else anchorPoint = cc.p(0.5, 0.5) end node:setAnchorPoint(anchorPoint) node:retain() slot:setDisplayImage(node) return self end --- 设置子骨骼所在的节点为新的node -- @string parentBoneName 子动画所在的父骨骼名 -- @string childBoneName 子动画的子骨骼名 -- @tparam cc.Node node 新的node -- @treturn self function NodeAni:setChildBoneNode(parentBoneName, childBoneName, node) assert(self.__armature and parentBoneName and childBoneName and node, "@NodeAni setChildBoneNode error!") local slot = self.__armature:getCCSlot(parentBoneName) local armature = slot:getCCChildArmature() assert(armature, "@NodeAni getChildArmature error") local childSlot = armature:getCCSlot(childBoneName) local oldDisplay = childSlot:getCCDisplay() local anchorPoint if (oldDisplay) then anchorPoint = oldDisplay:getAnchorPoint() else anchorPoint = cc.p(0.5, 0.5) end node:setAnchorPoint(anchorPoint) node:retain() childSlot:setDisplayImage(node) return self end function NodeAni:_registerAnimationEvent() assert(self.__armature, "@NodeAni addEventListener error! must setArmatureName first!!") if not self.__armature._isRegisterAnimation then self.__armature._isRegisterAnimation = true self.__armature:registerAnimationEventHandler(function(event) if event.type == Animation.COMPLETE and self.__endedFunc then self.__endedFunc(event) elseif event.type == Animation.LOOP_COMPLETE and self.__loopEndedFunc then self.__loopEndedFunc(event) end end) end return self end return NodeAni
时间: 2024-10-13 12:36:11