Me topé con un problema en las transiciones de objetos infinita en corona sdk. Al salir del juego e ir al menú principal, o reiniciar el nivel, marcaba un error porque no se había terminado bien la transición de los objetos.
Los objetos en este ejemplo son nubes, que al salir de la pantalla vuelven a aparecer al inicio, cambiando su posición y velocidad aleatoria mente.
Usando storyboard, el código seria de esta manera:
Tenemos la generación de las nubes y su transición, al terminarla, se vuelve a generar el objeto con el mismo id y a iniciar la transición, para así continuar de manera infinita, todo esto lo tengo dentro del método scene:createScene del storyboard.
clouds ={
{getImage = "images/cloud01.png"},
{getImage = "images/cloud02.png"},
{getImage = "images/cloud03.png"}
}
local returnClouds = function( obj )
if ( obj.moveTrans ) then
transition.cancel( obj.moveTrans )
obj.moveTrans = nil
makeClouds(obj.id)
end
end
function makeClouds(id)
imagesId = math.random (1,3)
local cloud = display.newImage(clouds[imagesId].getImage )
cloud.x = math.random (display.screenOriginX , centerX )
cloud.y = math.random (topScrn + cloud.height, centerY)
cloud.alpha = 0.7
cloud.id=id
group:insert(cloud)
allClouds[id] = cloud
cloud.moveTrans = transition.to( cloud, {time = math.random (30000 , 120000), x = w + 300, onComplete=returnClouds } )
end
for i=0,2 do
makeClouds(i)
end
El método de returnClouds es donde se cancela la transición, en este caso para iniciarla nuevamente.
La variable de allClouds se agrego como variable global, al inicio del proyecto, para así poder tener todas las nubes en el método de scene:exitScene del storyboard.
local allClouds = {}
Esto genera las nubes, su transición y el reinicio al llegar al final de la pantalla. Ahora para la cancelación de la transición y que no genere problemas, debe cancelarse en el método de scene:exitScene del storyboard.
El código para este ejemplo seria:
-- Called when scene is about to move offscreen:
function scene:exitScene( event )
local group = self.view
for i = 0, #allClouds do
local obj = allClouds[i]
if ( obj.moveTrans ) then
transition.cancel( obj.moveTrans )
obj.moveTrans = nil
end
end
-- INSERT code here (e.g. stop timers, remove listeners, unload sounds, etc.)
-- Remove listeners attached to the Runtime, timers, transitions, audio tracks
end
Espero les pueda ayudar en algo!
El código de la generación de nubes esta basado en el utilizado en este blog:
http://www.christianpeeters.com/rolly-bear-world/
Recomendado por cierto!