Tutorial 2 Andengine - Sprites, Sprites Animados

Hoy se animaran y moveran imagenes :D. Por fin no? Bueno el tema de hoy es como cargar imágenes, estáticas y animadas. Lo primero es entender que es un sprite. Un sprite es una imagen maniobrable. Como esta, en este caso animada:

Andengine







Pero esas imágenes se suelen estructurar y animar en tiempo de ejecución, y se estructura de esta manera:

Caminar

Primero lo básico y luego progresamos. Para poder poner una imagen en la pantalla de su celular, primero deben cargarla y para cargarla Andengine nos ofrece una muy buena práctica que son los Atlases.

Un Atlas es una hoja de imagenes, cargada en memoria en la cual ordenamos nuestras texturas para acceder a ellas de una manera más eficiente.

Para poder cargar imagenes debemos alojarla en la carpeta /assets en su proyecto de android, si no existe, la creamos:

Andengine

Veamos el cargado de un sprite en código, crearemos un Atlas y una textura primero:

private BitmapTextureAtlas miAtlas;
private ITextureRegion texturaChar;


Atlas

Luego, debemos crear el sprite a partir de nuestra textura:

private Sprite charSprite;

Sprite

Obtendremos algo así:

Sprite

Desde aquí, podemos escalar a muchas cosas, conseguir un set de sprites y construir un mapa, etc. Pero mejor animarlo no? Bueno el proceso solo cambia un poco, para usar Sprites animados, primero necesitamos uno, yo les facilito este:

Sprite animado

Los spritesheets, como se llaman estos dibujos, constan de filas y columnas, a las cuales podemos referenciar desde el motor para que se efectuen los cortes automaticos y las animaciones, según las frecuencias deseadas. Por ejemplo el spritesheet de arriba tiene 10 columnas y 10 filas, muchas vacias pero no importa, porque las podemos usar en el futuro para poner más animaciones.
Bueno primero crearemos una textura para nuestra animación:

private ITiledTextureRegion texturaAnimada;

Para luego cargarlo en nuestro atlas, el cual necesita ahora más tamaño, porque las medidas de la textura son 320 x 640 y debemos ubicarlo de manera que no tape la textura anterior osea 76 en x, 0 en y:

TiledTexture

Luego creamos el objeto para nuestro Sprite animado:

private AnimatedSprite spriteAnimado;

Animated Sprite

Tengamos en cuenta esto :

TiledTexture

Ejecutamos y obtenemos algo parecido a esto:

animacion

El código de la sesión lo pueden encontrar aquí y las imagenes en este mismo post, solo clickeenlas.

No duden en dejar sus preguntas, hasta la proxima.

Comentarios

  1. Por ahora solo he leido tu tutorial y confio que me valla bien en la práctica, ¡felicidades!. Me interesa saber de que otros temas de andengine haras tutoriales. Saludos.

    ResponderEliminar
  2. Primero voy a explicar el framework, como se usa básicamente y luego haré un ejemplo completo de un juego con varias técnicas un poco más avanzadas. También hablare de la parte gráfica. Y lo que a ustedes les interese :)

    ResponderEliminar
  3. Hasta ahora, no ve van saliendo las cosas como deberían, esperemos mejoremos en los próximos tutoriales, mientras voy aprendiendo lento.

    ResponderEliminar
  4. asi cortitos son los tutoriales o hay q descarse un tipo de texto o como ??

    ResponderEliminar
  5. Muy buenos tutoriales espero que sigas asi. Me surge una duda ¿Tiene que haber la misma distancia entre cada imagen dentro del spritesheet?

    ResponderEliminar
  6. No necesariamente. Es a libertad tuya :)

    ResponderEliminar
  7. Buen tutorial! pero tengo un problema, porque me sale la imagen completa del sprite junto a la animación como lo oculto o que hice mal.

    ResponderEliminar
  8. Pon un screen de como sale. Pero adelantando una respuesta revisa bien cuantas columnas tiene ese sprite animado

    ResponderEliminar
  9. Revisa bien cuantas columnas y filas tiene tu animated sprite . puedes poner una captura?

    ResponderEliminar
  10. Es de su mismo ejemplo y su codigo, separé en la parte derecha la animación para ver mi problema, lo que quiero es que no me salga de fondo la imagen completa.
    Aqui esta la imagen: https://www.dropbox.com/s/pbz94vvxnnk6qgn/sprite.jpg

    ResponderEliminar
  11. Si la causa es la cantidad de columnas y filas, revisala.

    ResponderEliminar
  12. Si lo pude solucionar gracias si en la primera imagen no tenia el numero de columnas y filas:
    texturaChar = BitmapTextureAtlasTextureRegionFactory.createFromAsset(miAtlas, this, "char.png", 0, 0);
    ahora lo puse y si funcionó pero cambiando a:
    texturaChar = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(miAtlas, this, "char.png", 0, 0,4,5);
    Gracias

    ResponderEliminar
  13. Hola, gracias por este tutorial, me está resultando muy últil.

    Tengo un par de problemas, cuando pruebo la aplicación me sale un aviso "la aplicación se detuvo" antes de arrancar. Otro problema, no sé si estará relacionado, es que no puedo incluir "throws IOException", me da el siguiente error:
    - implements org.andengine.ui.activity.SimpleBaseGameActivity.onCreateResources
    - Exception IOException is not compatible with throws clause in
    SimpleBaseGameActivity.onCreateResources()

    Saludos!

    ResponderEliminar
  14. Me encantaría ayudarte. Si pudieras enviarme el error completo y si pones el código donde lo marca seria excelente. Gracias

    ResponderEliminar
  15. He conseguido lanzar la app, eliminando "throws IOException" de:

    @Override
    protected void onCreateResources() throws IOException {

    BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
    miAtlas = new BitmapTextureAtlas(getTextureManager(), 256, 256, TextureOptions.DEFAULT);
    texturaChar = BitmapTextureAtlasTextureRegionFactory.createFromAsset(miAtlas, this, "walk_sheet.png", 0, 0);
    miAtlas.load();
    }

    Pero ni rastro del sprite en pantalla. El error q me da es el que he escrito antes, no encuentro una explicación más detallada. ¿Para qué sirve IOException exactamente?

    Muchas gracias por la atención :)

    ResponderEliminar
  16. Ponle el ioexception sino no te tirara error. Y sobre el error, de que tamaño es la textura?

    ResponderEliminar
  17. El tamaño de la textura es 256,256. El problema cuando añado IOException es que Eclipse me repite que es un error, que no es compatible con SimpleBaseGameActivity y me sugiere eliminarlo.

    Acabo de empezar con esto de programar en java y con andengine, disculpa que te de la chapa. xD

    ResponderEliminar
  18. No tranqui. En algún momento lo descubriremos

    ResponderEliminar
  19. Buenas amigo , tengo un problema al ejecutar el codigo, me vota esto en consola setWindowSurfaceColorBuffer: bad color buffer handle 0
    si me podrias ayudar te lo agradesco

    ResponderEliminar
  20. Muy buenas, quiero realizar el mismo sprite. Nose lo que hago mal pero el codigo talcual, cambio columnas y filas dado que mi imagen tiene 6 columnas y 3 filas, quiero que se me haga el sprite animado de 0 a 6 y nose porque cuando ejecuto se me queda en negro la pantalla.
    Espero tu respuesta, Gracias!

    ResponderEliminar

Publicar un comentario