Johnny Joe
Johnny Joe

Reputation: 76

function with transition.to() does not work

local rect = display.newRect(100, 100, 100, 100)

local moving, moving2
function moving()
    transition.to(rect, {time=500, x=300, y=100, onComplete=moving2})
end

function moving2()
    transition.to(rect, {time=500, x=100, y=300, onComplete=moving})
end

Hi everyone. I'm a newbie to Lua, so I would like know why my rectangle is not moving on my screen with this function? When I use only this code below, it moves but stops at the end. I'd like it to repeatedly move from one side to the other:

local rect = display.newRect(100, 100, 100, 100)
transition.to(rect, {time=500, x=300, y=100, onComplete=moving2})

Upvotes: 0

Views: 662

Answers (5)

user3131159
user3131159

Reputation: 61

Oh man, using a local object and calling it from both transitions is at some point going to cause a serious error, using your existing code pass the "rect" to each transition so it doesn't get nabbed by "still in transition."

local rect = display.newRect(100, 100, 100, 100)

local moving, moving2
function moving(inObj)
    if (inObj == nil) then inObj = rect end
    transition.to(inObj, {time=500, x=300, y=100, onComplete = function(iObj)
         moving2(iObj)
    end})
end

function moving2(inObj)
    transition.to(inObj, {time=500, x=100, y=300, onComplete, onComplete = function(iObj)
         moving(iObj)
    end})
end

OR

if you just want to be lazy :)

local rect = display.newRect(100, 100, 100, 100)
local movingIndex = 0
local moveData = {
{time = 500, x = 300, y = 100},
{time = 500, x = 300, y = 100}
}

function MoveObject(inObj)
    movingIndex = movingIndex + 1
    if (movingIndex > #moveData) then movingIndex = 1 end

    transition.to(inObj, {tag = "movingObjects", time=moveData[movingIndex].time, x=moveData[movingIndex].x, y=moveData[movingIndex].y, onComplete = function(iObj)
         MoveObject(iObj)
    end})
end

MoveObject(rect)

That way you just have one function and can just add animation points to the moveData table :)

By tagging the transition with tag = "movingObjects" we can pause and resume any running transition with just one call like transition.pause("movingObjects") or cancel etc. useful when you want to pause and/or are moving to another see without having to wait for a transition to end or by wrapping it in a pcall()

Just food for thought :)

btw:: I didn't test the code above I just wrote it in this editor so may have 1 or two things that need tweeeking.

Upvotes: 0

Johnny Joe
Johnny Joe

Reputation: 76

thanks everyone, it works well putting moving () at the end

I've tried quickly the last code with easing.continuousLoop but it was not working exactly as i want, but i gonna check it deeply later because it could be helpful

Anyway thanks all

Upvotes: 0

Lukis
Lukis

Reputation: 652

after putting at the end moving() it works fine. already tested it. or you may start by moving2()

Upvotes: 0

newprog
newprog

Reputation: 124

Like they said, it's not moving because you don't call moving() or moving2() in your code.

Just so you know, you don't have do this complicated stuff with two different functions in the onComplete parameter. You can have the same effect on your object with one transition by changing it's easing function and setting the iterations parameter to -1 for an infinite loop.

Here is a list of the available easing functions : http://docs.coronalabs.com/api/library/easing/index.html, as you can see the easing.continuousLoop function will do what you want.

You can try something like this instead :

local rect = display.newRect(100, 300, 100, 100)
transition.to(rect, {
    time = 500, 
    x = 300,
    y = 100,
    iterations = -1,
    transition = easing.continuousLoop,
})

Upvotes: 2

Rob Miracle
Rob Miracle

Reputation: 3063

You need to call one of the functions. Just put:

moving()

as the last line.

Upvotes: 2

Related Questions