有没有更好的方法在Corona Lua中链接过渡效果?

我正在使用以下代码制作一个垃圾箱的动画,当将某物拖放到垃圾箱上时,垃圾箱会发生变化:

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()。

代码可以正常工作,但我觉得它可以更好地编写。两个函数来实现对象的动画!

有没有更有效率的方法可以实现?

原文链接 https://stackoverflow.com/questions/7542357

点赞
stackoverflow用户686008
stackoverflow用户686008

在单个函数中使用延迟设置第二个转换;参考以下代码示例:http://developer.anscamobile.com/reference/index/transitionto

但是,根据您的情况,这并不一定更简单,因为现在您需要同时跟踪两个转换,而不仅仅是一次转换。在您贴出的代码中,您没有跟踪转换,但如果在转换完成之前需要取消它们(例如,玩家在转换中间切换场景),则可能应该这样。

2011-09-25 14:21:16
stackoverflow用户5420
stackoverflow用户5420

你可以通过在第一个转换调用中内联编写 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 的答案相似,这种方法也不支持取消。

2011-09-25 16:51:32
stackoverflow用户2125302
stackoverflow用户2125302

这个问题很久了,但由于我也尝试做同样的事情,所以我想分享我想出来的东西。这个函数按顺序执行传递的变量参数中的过渡效果。如果提供了 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})
2013-03-17 00:35:37
stackoverflow用户2656328
stackoverflow用户2656328
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

...等等。

2014-11-27 11:12:31