Tutorial videojuegos: Sprites animados

juego super cauldron android

Una gran parte de los sprites de los videojuegos son sprites animados, gracias a ellos daremos más dinamismo al juego. El uso es parecido al de los sprites normales que ya explicamos anteriormente. En esta sección explicaremos cosas que son válidas para cualquier libreria de desarrollo de videojuegos, pero tened en cuenta que los ejemplos están hechos para Android y Andengine.

La forma más sencilla, correcta y normal de poner sprites animados en nuestro videojuego es hacerlo con la animación en una misma imagen. Normalmente se hace una imagen con todos los frames que vaya a tener nuestro sprite. Para mayor sencillez se organiza en filas y en columnas, estando en cada fila los sprites de una misma animación. Por ejemplo:

Si os fijáis he creado dos animaciones, una para cuando el gato se mueve hacia abajo y otra para cuando se mueve hacia arriba, cada una esta en una fila, de esta forma a nivel visual el programador sabrá identificar la animación mucho más facilmente. 

Lo primero que hay que hacer es decirle al motor de Andengine que cargue el mapa con la textura de la animación

String path = 'grf/game/gato.png';
int rows = 2;
int cols = 2;

final TiledTextureRegion textureRegion = (TiledTextureRegion) BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mBuildableBitmapTextureAtlas, activity.getAssets(), path,rows,cols);

try {
   mBuildableBitmapTextureAtlas.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 1, 0));
	} catch (TextureAtlasBuilderException e) {e.printStackTrace();}
mBuildableBitmapTextureAtlas.load();

Para indicarle a la librería (Andengine) que tenemos un sprite animado tendremos que decirle las filas y las columnas que tiene, en este caso (2,2) y luego a la hora de animarlo tendremos que decirle que anime del frame 0 al 1 cuando vaya hacia abajo y del 2 al 3 cuando vaya hacia ariba. Yo uso Andengine, así que os pongo como se hace esto:

private void animate(ConstantsDirections direction){        
        int frameI=0,frameF=1;
        if (direction == ConstantsDirections.UP){            
           frameI=2,frameF=3;
        }else if (direction == ConstantsDirections.DOWN){
           frameI=0,frameF=1;
        }        
        animate(new long[]{200, 200}, frameI, frameF, true);
}    

Si os fijáis, hemos creado un método (dentro de nuestra clase KittenSprite) que sobreescribe al animate del Sprite y lo único que hace es decirle que si va hacia abjo use el frame 0 y el 1 y si va hacia arriba use el 2 y el 3. Ademas cada frame durará 200ms.

Votos totales: 21