最近项目里有一个业务需求是期望能在骨骼动画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