Есть ли лучший способ связать переходы в Corona Lua? - PullRequest
3 голосов
/ 25 сентября 2011

В настоящее время я анимирую мусорное ведро, когда что-то перетаскивается на него с этим кодом:

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 ]

1 голос
/ 25 сентября 2011

Вы можете сделать это, кодируя функцию 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, этот подход также не поддерживает отмену.

1 голос
/ 25 сентября 2011

Ну, вы можете сделать это в одной функции, установив второй переход с задержкой;обратитесь к этому примеру кода: http://developer.anscamobile.com/reference/index/transitionto

Однако в зависимости от вашей ситуации это не обязательно будет менее сложным, потому что теперь вам нужно отслеживать два перехода одновременно, а не только один переход за раз.В опубликованном вами коде вы не отслеживаете переходы, но, вероятно, вам следует это сделать, если вам необходимо отменить их до завершения перехода (например, игрок переключает сцены в середине перехода).

0 голосов
/ 27 ноября 2014
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

... и т.д.

0 голосов
/ 17 марта 2013

Этот вопрос довольно старый, но так как я пытался сделать то же самое, я решил, что должен поделиться тем, что придумал.Это последовательно выполняет переходы, которые передаются как переменные аргументы.Если задано 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})
...