个别本地代码可能编不过去,自己改一下吧
--- 骨骼动画包装器
-- 建议最多包括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