骨骼动画回调 cocos2dx+lua

最近项目里有一个业务需求是期望能在骨骼动画play完一个animation的时候能够回调继续下一个业务,但是看了一下void ArmatureAnimation::play(const std::string& animationName, int durationTo, int loop)并没有直接提供回调的功能支持,怎么办呢?当时想的是直接去取得animation的数据,拿到动画长度帧数movementdata.duration,然后用scheduler定时回调,问题在于,我们的项目始cocos2dx+lua,在lua端并没有直接开放取movementdata.duration,这个只能自己开了,这样的做法基本上能满足需求。唯一的问题是scheduler毕竟会有一些时间浮动,造成回调的时机可能会比实际需求晚一帧(概率时间),so,土办法是movementdata.duration-1去做,然后动画上延长一帧呗。虽然问题解决了,但是觉得不是很完美,想请教下各位有未类似的业务需求,然后大家的解决方法又是怎样?

为啥都没有人的?自顶一下

好悲惨 帮顶都没有

cocostudio里编辑动画可以设置回调事件,lua里监听事件就可以了

恩 谢谢 我试试,近来发现我原先的做法在帧率浮动过大的时候还是会有问题
and plus:回帖的人真少5555555555555

我刚入门,也遇到相同的问题,顶起!

有帧事件回调函数的setFrameEventCallFunc,在编辑器里设置帧事件,在lua中设置回调函数

顶起,用的不久,不会弄,想停止一个动画都不行

动作完结的时候会有api可以回调的,到时候你自己判断

quick自带的例子里有,TestAnimationEvent和TestFrameEvent
你需要的可能是


– Author: SunLightJuly
– Date: 2014-07-29 16:56:47

local ArmatureTestLayer = require(“layers.ArmatureTestLayer”)
local TestAnimationEvent = class(“TestAnimationEvent”, ArmatureTestLayer)

function TestAnimationEvent:ctor(index)
TestAnimationEvent.super.ctor(self)
self:creatTitleAndSubTitle(index)
end

function TestAnimationEvent:onEnter()
local armature = ccs.Armature:create(“Cowboy”)
armature:getAnimation():play(“Fire”)
armature:setScaleX(-0.24)
armature:setScaleY(0.24)
armature:setPosition(cc.p(display.left + 50, display.cy))

local function callback1()
    armature:runAction(cc.ScaleTo:create(0.3, 0.24, 0.24))
    armature:getAnimation():play("FireMax", 10)
end

local function callback2()
    armature:runAction(cc.ScaleTo:create(0.3, -0.24, 0.24))
    armature:getAnimation():play("Fire", 10)
end

local function animationEvent(armatureBack,movementType,movementID)
    local id = movementID
    if movementType == ccs.MovementEventType.loopComplete then
        if id == "Fire" then
            local actionToRight = cc.MoveTo:create(2, cc.p(display.right - 50, display.cy))
            armatureBack:stopAllActions()
            armatureBack:runAction(cc.Sequence:create(actionToRight,cc.CallFunc:create(callback1)))
            armatureBack:getAnimation():play("Walk")
        elseif id == "FireMax" then
            local actionToLeft = cc.MoveTo:create(2, cc.p(display.left + 50, display.cy))
            armatureBack:stopAllActions()
            armatureBack:runAction(cc.Sequence:create(actionToLeft, cc.CallFunc:create(callback2)))
            armatureBack:getAnimation():play("Walk")
        end
    end
end

armature:getAnimation():setMovementEventCallFunc(animationEvent)

self:addChild(armature)

end

return TestAnimationEvent