【问题标题】:Is there a better way of linking transitions in Corona Lua?有没有更好的方法来连接 Corona Lua 中的转换?
【发布时间】:2011-09-24 22:33:58
【问题描述】:

我目前正在使用以下代码为垃圾箱设置动画:

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

然后当我想开始动画时调用垃圾箱()。

代码运行良好,但我不禁觉得它可以编码得更好。动画对象的两个函数!

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

【问题讨论】:

  • 这段代码有什么效率低下的地方,具体来说?
  • 我认为问题在于丑陋而不是低效率。
  • 是的。我想这不是效率,更多的是我必须创建和调用两个函数来做一些非常基本的事情。我想知道是否有更整洁的方法。
  • 使用适当的缓动函数。见下方答案

标签: animation lua coronasdk


【解决方案1】:

你可以在一个函数中通过延迟设置第二个转换来完成它;参考这个代码示例:http://developer.anscamobile.com/reference/index/transitionto

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

【讨论】:

  • 谢谢,是的,我确实尝试过,但我似乎无法让它工作。现在我将不得不研究“跟踪转换”!
【解决方案2】:

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

【讨论】:

  • 谢谢。我想我仍然需要使用两个功能吗?也许我并没有想象中那么遥远……
【解决方案3】:

这个问题已经很老了,但由于我试图做同样的事情,我想我应该分享我的想法。这会顺序执行作为变量 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})

【讨论】:

    【解决方案4】:
    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
    

    ...等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2018-03-17
      相关资源
      最近更新 更多