是否有更好的方法来连接Corona Lua的过渡?

时间:2011-09-24 22:33:59

标签: animation lua corona

我正在使用此代码将某些内容拖放到其上时为垃圾桶制作动画:

local trashUp
local trashDown

trashUp = function()
    transition.to(
    trash, {time=100, xScale=1.2, yScale=1.2, onComplete=trashDown })
end

trashDown = function()
    transition.to(
    trash, {time=100, xScale=1, yScale=1})
end

然后在我想要启动动画时调用trashUp()。

代码工作正常,但我不禁觉得它可以更好地编码。两个动画对象动画的功能!

有什么方法可以更有效地做到这一点吗?

4 个答案:

答案 0 :(得分:1)

你可以通过设置延迟的第二次转换在单个函数中完成它;请参阅此代码示例:http://developer.anscamobile.com/reference/index/transitionto

根据您的情况,这不一定不那么复杂,因为现在您必须同时跟踪两个转换,而不是一次只跟踪一个转换。在您发布的代码中,您没有跟踪转换,但您可能应该在转换完成之前需要取消它们(例如,播放器在转换过程中切换场景)。

答案 1 :(得分:1)

您可以通过将onComplete函数与第一次转换调用内联编码来实现:

animateTrash = function()
    transition.to(
        trash,
        { time=100, xScale=1.2, yScale=1.2, onComplete=
            function()
                transition.to(
                    trash,
                    {time=100, xScale=1, yScale=1})
            end
        })
end

这将不再是 高效 ,但它确实与在一个地方设置垃圾桶动画有关。我认为这种方法很快就会失控,特别是如果您在动画垃圾桶时进行除转换以外的任何操作,例如更新程序的状态,或创建/销毁其他对象等等。

回应jhocking的回答,这种方法也不支持取消。

答案 2 :(得分:0)

这个问题很老了,但是因为我试图做同样的事情,我想我应该分享我想出的东西。这顺序执行作为变量args传入的转换。如果提供了onComplete,则在其转换完成时调用它。

local function transitionSequence(target, step, ...)
  local remaining_steps = {...}
  if #remaining_steps > 0 then
    local originalOnComplete = step.onComplete
    step.onComplete = function(target)
      if originalOnComplete then
        originalOnComplete(target)
      end
      transitionSequence(target, unpack(remaining_steps))
    end
    transition.to(target, step)
  else
    transition.to(target, step)
  end
end

示例:

transitionSequence(myImage,
  {xScale=0.5, onComplete=function(t) print("squeeze") end},
  {xScale=1, onComplete=function(t) print("relax") end},
  {yScale=2, onComplete=function(t) print("stretch") end},
  {yScale=1, onComplete=function(t) print("relax again") end})

答案 3 :(得分:0)

transition.to( trash, {time=t, delta=true, xScale=1.5, transition=easing.continousLoop} )

对于这样的目的也非常有用:

easing.sin = function( f, a )
  return function(t, tmax, start, d)
    return start + delta + a*math.sin( (t/tmax) *f * math.pi*2 )
  end
end

easing.sinDampened = function( f, a, damp )
  return function(t, tmax, start, d)
    return start + delta + a*math.sin( damp^(t/tmax) *f * math.pi*2 )
  end
end

...等