基于dragonbones的cocos2dx lua封装

个别本地代码可能编不过去,自己改一下吧

--- 骨骼动画包装器
-- 建议最多包括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

基于dragonbones的cocos2dx lua封装的相关文章

Cocos2d-x lua 封装的一个简单弹出框

..有2种类型:只有确定按钮.有确定和取消按钮 确定和取消按钮中的确定可以执行回调函数,标签可以自动换行,前提是在IOS模拟器上运行,mac下的模拟器看不出效果,功能比较简单,基本功能是实现了,交互上不是很好,还得改进,点击对话框外面的区域,对话框也会消失,可自行修改实现自己的需求. 继承于Layer,用类的方式写的,写的不是很好,望大神们多多指教. 代码奉上,比较简单: require "Cocos2d" require "Cocos2dConstants" --

基于Cocos2dx+Lua v3.x的RichLabel

RichLabel 简介 RichLabel基于Cocos2dx+Lua v3.x解析字符串方面使用了labelparser,它可以将一定格式的字符串,转换为lua中的表结构扩展标签极其简单,只需添加一个遵守规则的标签插件即可,无需改动已存在代码!!! (标签插件都在labels文件夹下) labelparser的详解labelparser在github上的源码RichLabel在github上的源码 支持图片(缩放,旋转,是否可见) 支持文本属性(字体,大小,颜色,阴影,描边,发光) 支持标签

cocos2d-x lua 中使用protobuf并对http进行处理

本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链接 http://blog.csdn.net/vpingchangxin/article/details/24458051 protobuf  Google的一个非常好用的数据传输的封装 说实话Google的东西确实比較好用 所以我们前后端数据交换就用他了 只是Google没有对lua进行支持 还好社区有开源的大侠们贡献 找了全部关于lua protobuf 我仅仅找到

Cocos2dx+lua合适还是Cocos2dx+js合适?

问题: 开发cocos2dx手游Cocos2dx+lua合适还是Cocos2dx+js合适 百牛信息技术bainiu.ltd整理发布于博客园 回答: 作者:廖宇雷链接:https://www.zhihu.com/question/21130385/answer/18485625来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 2014.02更新:请放心选择 Lua 吧.触控已经收购了 quick-cocos2d-x,2014年肯定会大力强化 cocos2d-x 的

Cocos2d-x Lua Node与Node层级架构

Cocos2d-x Lua Node与Node层级架构 Cocos2d-x Lua采用层级(树形)结构管理场景.层.精灵.菜单.文本.地图和粒子系统等节点(Node)对象.一个场景包含了多个层,一个层又包含多个精灵.菜单.文本.地图和粒子系统等对象.层级结构中的节点可以是场景.层.精灵.菜单.文本.地图和粒子系统等任何对象.节点的层级结构如下图所示. 节点的层级结构 这些节点有一个共同的父类Node,Node类图如下图所示.Node类是Cocos2d-x Lua最为重要的根类,它是场景.层.精灵

Cocos2d-x Lua 播放视频(iOS&android)

最近刚转了游戏,来公司不久就接到一个任务就是做一个视频播放的功能,自己花了3天时间,暂时实现了一个简易的功能,特写篇博客,以作记录. 参考地址如下: http://blog.csdn.net/xiaominghimi/article/details/6870259 http://blog.csdn.net/kaitiren/article/details/11832851 http://blog.csdn.net/candyforever/article/details/8905852 实现功能

Cocos2d-x Lua 读取Csv文件,更方便的使用数据

我的书上或者是我曾经出售的源码里,都有Csv文件的影子. 也许是先入为主吧,我工作那会用的最久的配置文件就是Csv,所以我在很多游戏里都会情不自禁地优先选择它. Csv文件,格式很简单,就是一行一条数据,字段之间用逗号分隔,策划也可以方便地使用Excel进行编辑. Csv格式的文件,解析起来也很简单,所以自己动手写写很快~(小若:我就喜欢拿来主义,你怎么着) 最近在用Lua写游戏,对于技能.怪物等配置,我还是选择用Csv~ 不得不说,Lua等脚本语言,在某些方面是C++没法比的,这次我就用Csv

cocos2d-x + Lua接入iOS原生SDK的实现方案[转]

相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我做过项目中接入iOS原生SDK实现方案的一个总结,在这里分享给大家,希望对自己和大家的开发工作都有帮助. 在展开正文之前,先做几点说明: 1.我这里说的iOS原生SDK是指那些完全用Objective-C语言开发,为原生iOS程序设计的SDK.swift很好很强大,不过我还没用过,惭愧,不过语言终归

[原创]cocos2d-x + Lua接入iOS原生SDK的实现方案

相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我做过项目中接入iOS原生SDK实现方案的一个总结,在这里分享给大家,希望对自己和大家的开发工作都有帮助. 在展开正文之前,先做几点说明: 1.我这里说的iOS原生SDK是指那些完全用Objective-C语言开发,为原生iOS程序设计的SDK.swift很好很强大,不过我还没用过,惭愧,不过语言终归