cocos2d lua 之骨骼动画

本文详细介绍了在Cocos2d3.10Lua环境下使用骨骼动画的优势及其实现方式,对比帧动画,骨骼动画拥有更少的美术资源、更小的体积、更好的流畅性和动画重用性。并通过Spine工具和代码示例展示了如何创建和控制骨骼动画。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境: cocos2d 3.10 lua

参考: https://www.cocos.com/docs/native/v3/spine/zh.html

帧动画与骨骼动画区别
帧动画:每一帧都是角色特定姿势的一个快照,动画的流畅性和平滑效果都取决于帧数的多少。
骨骼动画:角色的身体部件图片绑定到一根根互相作用连接的“骨骼”上,通过控制这些骨骼的位置、旋转和缩放而生成的动画

骨骼动画比帧动画要求更高的处理器性能,但也具有更多的优势:
    1. 更少的美术资源:骨骼动画的资源是一块块小的角色部件
    2. 更小的体积:帧动画需要提供每一帧图片。而骨骼动画只需要少量的图片资源
    3. 更好的流畅性:骨骼动画使用差值算法计算中间帧,这能让动画总是保持流畅的效果
    4. 动画重用:你可以更换角色的装备,甚至改变角色的样貌来达到动画重用的效果
    5. 不同动画可混合使用:不同的骨骼动画可以被结合。比如可以转动头部、射击并且同时也在走路

骨骼动画工具:

Spine,下载地址:http://zh.esotericsoftware.com/

Dragonbones,下载地址:https://dragonbones.github.io/cn/index.html

Spriter,下载地址:https://brashmonkey.com/

程序框架:

代码实现(参考于官方示例):

local skeletonNode = sp.SkeletonAnimation:create("res/spine/spineboy.json", "res/spine/spineboy.atlas", 0.6)
skeletonNode:setPosition(cc.p(winSize.width / 2, 20))
skeletonNode:setScale(0.5)
--[[
设置混合,避免衔接的动画不连贯
参数1:起始动画
参数2:结束动画
参数3:间隔时间
]]
skeletonNode:setMix("walk", "jump", 0.2)
skeletonNode:setMix("jump", "run", 0.2)
--[[ 
设置当前播放动画,只能播放一种
参数1: 层级
参数2: 动画名
参数3: 是否循环
]]
skeletonNode:setAnimation(0, "walk", true)
--[[
添加不同的动画
参数1: 层级
参数2: 动画名
参数3: 是否循环
参数4:延迟时间
]]
skeletonNode:addAnimation(0, "jump", false, 3)
skeletonNode:addAnimation(0, "run", true)
self:addChild(skeletonNode,100)

skeletonNode:registerSpineEventHandler(function (event)
     print(string.format("[spine] %d start: %s", event.trackIndex, event.animation))
end, sp.EventType.ANIMATION_START)

skeletonNode:registerSpineEventHandler(function (event)
     print(string.format("[spine] %d end:", event.trackIndex))
end, sp.EventType.ANIMATION_END)
        
skeletonNode:registerSpineEventHandler(function (event)
     print(string.format("[spine] %d complete: %d", event.trackIndex, event.loopCount))
end, sp.EventType.ANIMATION_COMPLETE)

skeletonNode:registerSpineEventHandler(function (event)
     local data = event.eventData
     print(string.format("[spine]%d event: %s,%d,%f,%s", event.trackIndex,data.name,data.intValue,data.floatValue,data.stringValue)) 
end, sp.EventType.ANIMATION_EVENT)
  

local listener = cc.EventListenerTouchOneByOne:create()
listener:registerScriptHandler(function (touch, event)
    if not skeletonNode:getDebugBonesEnabled() then
         -- 设置骨骼显示
         skeletonNode:setDebugBonesEnabled(true)
    elseif skeletonNode:getTimeScale() == 1 then
         -- 设置动画播放的快慢
         skeletonNode:setTimeScale(0.3)
    else
         skeletonNode:setTimeScale(1)
         -- 设置骨骼隐藏
         skeletonNode:setDebugBonesEnabled(false)
    end
    return true
end,cc.Handler.EVENT_TOUCH_BEGAN)

local eventDispatcher = self:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, self)

 

转载于:https://www.cnblogs.com/SkyflyBird/p/10058580.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值