Tutorial videojuegos: Modificadores de sprites

juego con pathmodifier android

Cuando programamos un videojuego una de las cosas que solemos necesitar es mover un sprite de un lado a otro, ampliarlo, rotarlo, etc. Esto podemos hacerlo a mano calculando la recta que une el punto inicial al final y moviendo determinados pixeles en el eje X y en el eje Y siguiendo dicha recta. Además deberemos hacerlo en un tiempo determinado para que el sprite lleve la velocidad que queramos. Esto no sé si os parece fácil pero no lo es. Además de que además podemos querer que ademas de moverse lo haga con distintos efectos (rebotes, aceleración, etc). Esto complica mucho el desarrollo de videojuegos. Si además queremos combinar movimientos (giros, desplazamientos, ampliaciones,...) la cosa se vuelve bastante complicada.

Pero Andengine viene en nuestra ayuda ya que pone a nuestra disposicion los Modifiers. Son un conjunto de clases que nos permiten realizar todas esas transformaciones de sprites con velocidades elegidas por nosotros, con combinaciones simultaneas o secuenciales y además todas ellas con efectos de inercia, rebotes, etc.

Los modificadores que ahora veremos tienen como ultimo parámetro la función "Ease", esta función luego veremos algún ejemplo, pero básicamente es el efecto que queremos que tenga el modificador (inercia, rebote, aceleración, etc). Es decir, podemos querer que un sprite se mueva de una posicion a otra, pero que lo haga acelerando cada vez más, para ello escogeremos una función Ease determinada.

Modificadores principales de Sprites:

  • MoveModifier: MoveModifier a=new MoveModifier(duration,fromX,toX,fromY,toY,EaseFunction) -> Modificador para mover un sprite de un lado a otro
  • AlphaModifier: AlphaModifier a= new AlphaModifier(duration, fromAlpha, toAlpha,EaseFunction); -> Modificador para cambiar el alpha de un sprite
  • DelayModifier: DelayModifier a = new DelayModifier(duration); -> Modificador de pausa, se usa para si queremos concatenar modificadores y hacer alguna pausa entre ellos
  • RotationModifier: RotationModifier a = new RotationModifier(duration,fromGrade,toGrade,EaseFuntion)-> Modificador de rotación
  • ScaleModifier: ScaleModifier a = new ScaleModifier(duration, scaleOrig,scaleFin,EaseFunction) -> Modificador de cambio de tamaño
  • PathModifier: Este es el más complejo pero el más versátil, nos permitira hacer seguir a nuestro sprite una ruta de puntos que le digamos:
// Definimos los puntos por los que queremos que se mueva nuestro sprite con el Path. En el Path si os fijais ponemos 4 porque vamos a definir 4 puntos con coordenadas

final Path path = new Path(4).to(10, 10).to(10, 50).to(100,70).to(10, 10);

// Suponemos que "player" es nuestro sprite que queremos mover. Registramos el modificador pathmodifier con una duracion de 30 segundos.
player.registerEntityModifier(new PathModifier(30, path));

Nexos de modificadores

Si queremos unir varios modificadores para que un sprite haga varias acciones hay que usar los nexos de modificadores. De esta forma podremos hacer que un sprite gire y se mueva a la vez. O que se mueva a una posición y luego gire. Las posibilidades son infinitas. Los principales nexos de modificadores son:

  • ParallelEntityModifier: ParallelEntityModifier a = new ParallelEntityModifier(modificador1,modificador2,....) -> los modificadores se ejecutarán en paralelo
  • SequenceEntityModifier: SequenceEntityModifier a = new SequenceEntityModifier(modificador1, modificador2, ...) -> los modificadores se ejecutaran uno detras de otro en ese orden 
  • LoopEntityModifier: LoopEntityModifier a = new LoopEntityModifier(modificador,repeticiones) -> el modificador se repetira las repeticiones que le digamos. Si ponemos 0 será infinito.

Ease Functions

Como habréis visto arriba, los modificadores admiten como último parametro algo que hemos llamado "Ease function", esas funciones Ease  son funciones "facilitadoras" que lo que hacen es añadir algunas características que ya hemos comentado antes: Inercia, rebote, etc. 

Hay muchas Eases disponibles, os las listo debajo aunque para saber que hace cada una lo mejor es que instaléis la aplicación oficial de Andengine y lo veáis ahí:

  • EaseBackIn, EaseBackOut, EaseBackInOut
  • EaseBounceIn, EaseBounceOut, EaseBounceInOut
  • EaseCircularIn, EaseCircularOut, EaseCircularInOut
  • EaseCubicIn, EaseCubicOut, EaseCubicInOut
  • EaseElasticIn, EaseElasticOut, EaseInOut
  • EaseExponentialIn, EaseExponentialOut,EaseExponentialInOut
  • EaseQuadIn, EaseQuadOut, EaseQuadInOut
  • EaseQuartIn, EaseQuartOut, EaseQuartInOut
  • EaseQuinIn, EaseQuinOut, EaseQuinInOut
  • EaseSineIn, EaseSinOut, EaseSinInOut
  • EaseStrongIn, EaseStrongOut, EaseStrongInOut

Todas estas funciones ease se pueden añadir a los modificadores, para hacerlo se ponen como último parámetro del modificador y se llaman de forma estática a su método getInstance. Por ejemplo: MoveModifier mover = new MoveModifier(1f,100,100,200,200,EaseQuartIn.getInstance());

Un ejemplo de modificadores complejos en Andengine

// Movemos el sprite
MoveModifier mover = new MoveModifier(2f,10,10,100,100);
// Ampliamos
ScaleModifier ampliar = new ScaleModifier(2f,1f,2f);

// Movemos al origen
MoveModifier mover2 =new MoveModifier(4f,100,100,10,10); 

// Reducimos al tamaño original
ScaleModifier reducir = new ScaleModifier(2f,2f,1f);

// Movemos y ampliamos a la vez
ParallelEntityModifier paralelo1 = new ParallelEntityModifier(mover,ampliar);

// Movemos y reducimos a la vez
ParallelEntityModifier paralelo2 = new ParallelEntityModifier(mover2,reducir);

// Ponemos en secuencia los dos paralelos que hemos hecho antes
SequenceEntityModifier secuencia = new SequenceEntityModifier(paralelo1,paralelo2);

// Repetimos indefinidamente
LoopEntityModifier loop = new LoopEntityModifier(secuencia,0);

// Supongo que player es el sprite que tenemos cargado
player.registerEntityModifier(loop);

En el juego que he puesto como imagen del artículo tuve que hacer uso intensivo del pathmodifier. Es un juego de Scalextric con una pista. La pista la cree con lineas unidas por puntos. Los puntos los metí en un pathmodifier para que los coches lo vayan siguiendo. Las curvas las hice dividiendo la curva en un conjunto de rectas unidas. De esta forma el coche va siguiendo un PathModifier de 100-200 lineas definidas por el trazado del circuito.

Podéis ver el juego del Scalextric en Scadroid

Votos totales: 52