Libgdx: Actions like cocos2d

Una de las cosas que mas me gustó del trabajo con cocos2d fue sin dudas sus acciones, nunca había trabajado con una librería que implementase esta filosofía y ahora me doy cuenta de lo perdido que estaba. En libgdx se echa de menos las acciones de cocos2d, aunque trae sus propias acciones se queda un poco cojo ya que implementa lo más básico .. un movimiento lineal, el acelerado, decelerado, el overshoot (el típico rebote de una cosa en el suelo). Que vale, cumplen su función más básica pero frente a cocos2d te sientes un poco desértico.

Una de las mejores opciones en libgdx para hacer interpolaciones es usar Aurelien Ribon que es lo mejorcito que podéis encontrar. Sólo tenéis que mirar su ultima demo para ver sus capacidades, y podéis probarlo directamente en vuestro android o vía html porque para quien no lo sepa libgdx ya tiene un backend para generar código html5+js.

Bueno .. esto es muy muy bueno no lo dudo pero tenia la simple necesidad de implementar un movimiento elástico, así que la opción mas rápida fue la de buscar estar interpolación en cocos2d y traérmela. el resultado ha sido traer las interpolaciones básicas de Cocos2d a libgdx: Easecubic, EaseExponential, EaseSine, EaseElastic, EaseBounce, EaseBack, todas en sus 3 versiones, In, Out & InOut

 like cocos2d: ver todas las interpolaciones

Actions y Pools de libgdx

Una cosa a tener en cuenta en libgdx es que todas las actions() y todos los interpolators() implementan una Pool statica que por defecto se inicia con 4 instancias de la propia clase:

Que significa esto? .. pues sencillo, que al usar libgdx ya se han creado 4 instancias de todas estas clases y están en una pila esperando a que se usen, con esto se gana que la librería sea ágil al crear uno de estos objetos, ya que al instanciar uno nuevo (mediante su método static .$) este nos dará uno de los que ya tiene creados en la pila … y se gana tiempo.

Por un lado nos agiliza .. pero por otro nos puede penalizar en memoria si nos liamos a añadir nuevos interpolatos manteniendo una pila, lo que comúnmente se llama ‘la he liado parda’. Yo de momento voy a añadir 15 nuevos interpolators y en la mayoría de los casos solo vamos a usar 1 ó 2 de estas clases como mucho, así que está claro que (aunque no vayamos a notar esta perdida de memoria) vamos a estar malgastando memoria para nada.

La solución tampoco tiene que ser muy radical … lo único que he hecho ha sido agrupar todas las interpolaciones del mismo tipo en una clase, y no hacer separación de los casos (In,Out,InOut) así que hemos bajado de 15 clases a 5

así tenemos solo una Pool que recoge todas las interpolaciones de tipo Elastic independientemente de su dirección .. y lo mismo para cada tipo de interpolación.

Nuestra primera interpolación: Elastic rules

Aquí tenemos nuestra primera interpolación … realmente esta es la culpable de haber arrastrado las demás, ya que lo único que quería era implementar el ElasticOut. Aquí tenéis el código de esta clase, implementando las 3 direcciones:

Con esta clase ya tendríamos implementadas la interpolación en sus 3 direcciones, listo para probar

Aquí os dejo también el proyecto Completo!! .. incluido gdxOfcode (que como ya os he dicho con cada nuevo proyecto va creciendo en clases)

 like cocos2d: ver todas las interpolaciones

 Actions lik cocos2d +GdxOfcode (5.06 Mb)

cocos2d vs gdx.math

Antes de traerme las interpolaciones estuve investigando las clases que trae libgdx en su package gdx.math, podemos encontrar una clase Interpolation que ya implementa los cálculos para hacer la mayoría de estas interpolaciones, y se podrían haber usado en lugar de implementar el calculo en cada clase … además (no se si para bien o para mal) esta clase ya tiene una instancia statica de la mayoría de las interpolaciones con lo que se puede ahorrar bastante en coste de inicialización.

Otro detalle que me ha gustado es que la interpolación bounce es configurable con el numero de botes que quieres dar .. por si alguien se anima a implementarla y ver que sale.

You may also like...

4 Responses

  1. cheborra dice:

    Is the zip example ok?

    I think is the Scene Transition example…

  2. Membrillo dice:

    Amigo estos tutoriales están increibles!!!, por favor no pares de seguir haciendo articulos, estaré pendiente

  3. pelkose dice:

    Los tutoriales son excelentes, ojalá no dejes de lado esta iniciativa. Mucha suerte y gracias por compartir esta información.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *