CocoStudio在Cocos2d-x Lua项目中的应用--加载动画

当游戏进入了手游时代, 快成为了开发游戏的主题曲. 开发快, 上线快, Bug修复快, 挣钱也会特别快.   
脚本成为了在游戏开发中的助力, 而且脚本可以即时更新的特性, 更是为了避免平台冗长的审核过程的法宝. Lua脚本以其开发速度快, 运行快, 成为了众多游戏开发的首选.   
 
CocoStudio也是以快著称, 如果CocoStudio和Cocos2d-x Lua珠联璧合, 快上加快, 很有想象的空间.   
今天我们来看下在Cocos2d-x Lua项目中如何调用CocoStudio导出的动画.   
 
一 版本   
我们采用的是Cocos2d-x 3.0RC0和CocoStudio 1.3, 不同的版本在功能上可能略有差异, 希望大家尽量能采用这个版本.   
 
大家请自行下载并配置开发环境, 如果大家在安装活配置的过程中遇到问题, 不妨在CocoaChina的CocoStudio专区提出, 一起交流.   
 
二  创建新的Cocos2d-x Lua项目并导入资源   
大家在命令行或者终端中, 找到将要存放工程的路径并运行命令   
cocos new -p com.young40.animation -l lua LuaAnimation   
我们在LuaAnimation\frameworks\runtime-src\目录下可以看到有iOS, Mac, Android, Win32等工程.   
 
大家可以根据自己的情况来打开对应的工程项目. 我是在Win下创建的, 所以选择Win32的工程并打开.   
 
我们打开CocoStudio的动画编辑器, 并打开示例项目HeroAnimation.   
我们切换到动画模式, 为attack的其中一帧添加一个kill帧事件. 对帧事件不太了解的同学, 可以看下这篇教程.   
CocoStudio sample讲解 SampleCollision骨骼动画与简单碰撞  http://www.cocoachina.com/bbs/read.php?tid=189665    
大家可以看下其中的帧事件部分, 这里不再赘述.   
 
导出这个项目, 稍后将导出的文件复制到LuaAnimation的res目录下边. 可能iOS, Mac工程还需要将其添加到Xcode项目中, 这里不再赘述.我们还增加了两个武器的图片(weapon1tex.png, weapon2tex.png), 做换装的演示.   
 
三 代码实现   
我们在代码中对CocoStudio做好的动画的操作很简单, 大概可以分为以下几个操作.   
1. 加载动画数据   
2. 生成动画对象   
3. 播放动画   
    包括按名称播放, 按顺序播放, 以及获取动画列表数量   
4. 骨骼动画换装   
     添加新的皮肤, 切换新的皮肤   
5. 帧事件和动画事件   
     添加帧事件监听, 以及监听回调   
     添加动画事件, 以及监听回调   
 
我们在默认的Cocos2d-x Lua工程里面直接修改main.lua.   
好, 让我们直接看代码吧. 附件中有工程打包下载, 需要大家将2d-x copy一份到LuaAnimation\frameworks\cocos2d-x.    
 
 
 
 
 
 
 
 
 
 -- 运行场
 local sceneGame = cc. Scene:create()
 --sceneGame:addChild(createLayerFarm()) --注
 --sceneGame:addChild(createLayerMenu())
 
 local function createTestLayer ()
 local layerTest = cc. Layer:create()
 
 -- 加画-资
 -- 还有addArmatureFileInfoAsync, 大行看, 今暂不
        ccs .ArmatureDataManager: getInstance():addArmatureFileInfo( "res/Hero0.png", "res/Hero0.plist" , "res/Hero.ExportJson" )
 
 -- 创画对
 local armature = ccs. Armature:create( "Hero")
 -- 设
        armature :setPosition(origin. x + visibleSize.width / 3, origin .y + visibleSize. height / 5)
 -- 播画, 播
        armature :getAnimation(): play("attack")
 -- 添
        layerTest :addChild(armature)
 
 -- 帧件回
 do
 -- 添
 local killEventCount = 0 -- 计件发
 local killEventLabel =  cc. Label:create( "Kill Event Count: 0", s_markerFeltFontPath, 20)
            killEventLabel :setPosition(cc. p(50, 10))
 
            layerTest :addChild(killEventLabel)
 
 -- 添件回
            armature :getAnimation(): setFrameEventCallFunc(function ( bone, evt, originFrameIndex, currentFrameIndex )
 if evt == "kill" then -- 判断件名为kill
                    killEventCount = killEventCount + 1
 -- 更
                    killEventLabel :setString("Kill Event Count: " .. killEventCount)
 end
 end)
 end
 
 -- 动画事件回
 do
 -- 添画事件显
 local moveEventLabel =  cc. Label:create( "", s_markerFeltFontPath, 20)
            moveEventLabel :setPosition(cc. p(50, 30))
 
            layerTest :addChild(moveEventLabel)
 
 -- 添件回
            armature :getAnimation(): setMovementEventCallFunc(function (arm, eventType, movmentID)
 -- 判断件类
 local actionType = "Start Event"
 if eventType == ccs. MovementEventType.start then
                        actionType = "Start Event"
 elseif eventType == ccs. MovementEventType.complete then
                        actionType = "Complete Event"
 elseif eventType == ccs. MovementEventType.loopComplete then
                        actionType = "Loop Complete Event"
 end
 
 -- 更
                    moveEventLabel :setString("Got Event " .. movmentID .. " " .. actionType)
 end)
 end
 
 -- 我摸后切换画-
 -- 接
 local function onTouchBegan(touch, event)
 return true
 end
 
 local currentIndex = 0
 -- 获
 local animationListCount = armature: getAnimation():getMovementCount()
 -- 触摸结切换
 local function onTouchEnded(touch, event)
 -- 通过播
            armature :getAnimation(): playWithIndex(currentIndex)
 
            currentIndex = currentIndex + 1
 if currentIndex >= animationListCount then
                currentIndex = 0
 end
 end
 
 -- 监摸事
 local listener = cc. EventListenerTouchOneByOne:create()
        listener :registerScriptHandler(onTouchBegan, cc.Handler .EVENT_TOUCH_BEGAN)
        listener :registerScriptHandler(onTouchEnded, cc.Handler .EVENT_TOUCH_ENDED)
 local eventDispatcher = layerTest: getEventDispatcher()
        eventDispatcher :addEventListenerWithSceneGraphPriority(listener, layerTest)
 
 -- 换
 -- 生(这里)
 local skin1 = ccs. Skin:create( "res/weapon1tex.png")
 local skin2 = ccs. Skin:create( "res/weapon2tex.png")
 
 -- 获, 并
 local bone = armature: getBone("Layer17")
        bone :addDisplay(skin1, 1)
        bone :addDisplay(skin2, 2)
 
 -- 创
 local function createLayerMenu()
 local menu = cc. Menu:create()
 
 local label = cc. Label:create( "ChangeDisplay", s_markerFeltFontPath, 20)
 local menuChageDisplay = cc. MenuItemLabel:create(label)
            menuChageDisplay :setAnchorPoint(cc. p(0, 0))
 
 -- 换中装Index
 local displayIndex = 0
            menuChageDisplay :registerScriptTapHandler(function ()
                    displayIndex = displayIndex + 1
 if displayIndex > 2 then
                        displayIndex = 0
 end
 
 -- 换
                    bone :changeDisplayWithIndex(displayIndex, true)
 end)
 
 -- 增
 local menuReload = cc. MenuItemLabel:create(cc .Label: create("Reload", s_markerFeltFontPath, 20))
            menuReload :setAnchorPoint(cc. p(0, 0))
            menuReload :setPosition(0, 20)
            menuReload :registerScriptTapHandler(function ()
                    dofile( "src/main.lua") -- 强行重, 写, 大
 end)
 
            menu :setAnchorPoint(cc. p(0, 0))
            menu :setPosition(cc. p(50, 60))
            menu :addChild(menuChageDisplay)
            menu :addChild(menuReload)
 
 return menu
 end
 
        layerTest :addChild(createLayerMenu())
 
 return layerTest
 end
 
 -- 添测试Scene
    sceneGame :addChild(createTestLayer())
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值