miércoles, 11 de junio de 2014

Cancelar transiciones en corona sdk

Hola,

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!