Tutorial videojuegos: carga de Sprites

Juego android space4kids gratis

Capítulo 3 del curso de programación de videojuegos.

Si habéis llegado hasta aquí es porque sabéis lo que es un sprite, pero por si acaso os daré una breve explicación. Un sprite es una imagen que cargamos en memoria y con la que el usuario y /o la aplicación interactuará. Los Sprites normalmente se realizan en PNG por los motivos que comentamos anteriormente.

En la mayoría de motores gráficos los sprites y fondos (un fondo no es realmente un sprite) se deben cargar en memoria usando lo que se llaman Atlas. Los atlas son superficies de memoria donde se añaden las imágenes unas pegadas a otras ocupando una superficie determinada. De esta se ahorrará rendimiento y memoria. Estos Atlas tienen tamaños que definiremos en nuestra programación como superficies de un ancho y alto potencias de 2. Es común hacer atlas de tamaños como estos: {256x256}, {512x256}, {1024x512}, etc dependiendo del tamaño de las imágenes que vayan a contener.

Es importante conocer que los atlas deben tener potencias de dos y que deben ser lo más pequeños posibles. Atlas de 2048 en algunos móviles no funcionan, por tanto es recomendable hacerlos como mucho de 1024. A la hora de escoger el tamaño debemos tener en cuenta esa restricción, por tanto puede ocurrir que todas nuestras imágenes no nos quepan en un atlas y que debamos hacer 2 o más atlas.

Los sprites en los motores de programación de videojuegos suelen tener muchas características / modificadores que pueden usarse. En Andengine las principales son:

  • Visibilidad: setVisible(boolean): Permite indicar si el sprite es visible o no
  • Ignorar: setIgnoreUpdate(boolean): Permite indicar si el sprite no deberá ser tenido en cuenta (porque no queremos pintarlo) en el bucle de pintado. Esto debemos ponerlo a true cuando el sprite esté fuera de la pantalla por ejemplo, o cuando el sprite ya no deba hacer nada.
  • Modificadores: registerEntityModifier(Modifier): Con esto podremos añadir modificadores para que el sprite se transforme, por ejemplo, para cambiar el alpha, la posicion, el tamaño, etc. Estos modificadores tienen entre otros parámetros el tiempo, el tiempo indicará cuanto queremos que tarde en hacerse la modificacion.
  • Alpha: setAlpha(float): El nivel de transparencia que queremos que tenga un sprite

En el caso de Andengine para que un sprite pueda tener alpha hay que haberle hecho antes un setter (setBlendFunction), si no lo hacemos nos volveremos locos porque no nos hará caso en los setAlpha:

Sprite sprite = new Sprite(XXXXXX);
sprite.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
  • Zindex: setZIndex(int): La posición en el eje Z del sprite, esto servirá para poder decidir qué sprites se pìntarán encima y cuales se pintarán debajo. En el caso de andengine si no indicamos el setZIndex se pintarán en el orden en que se añadan a la escena. Por tanto es recomendable que pongamos siempre zIndex si no queremos sorpresas. Además de definir el zIndex luego hay que llamar expresamente a la funcion de ordenación de la escena (sortChildren()). Además si en tiempo de ejecución cambiamos los zIndex de los sprites deberemos llamar tambien a sortChildren si queremos que tenga efecto. Esto último no es muy recomendable porque podríamos notar saltos en la fluidez del juego (aunque si es necesario podremos hacerlo).
// El sprite2 saldrá por encima del sprite1
sprite1.setZIndex(100);
sprite2.setZIndex(101);
// Reordenamos la escena
mGameScene.sortChildren();
  • Posicion: setPosition(float,float): Todo sprite tiene una posición asociada. Con este método podremos mover el sprite a una posicion. Normalmente se usa para ponerlo en la posicion original. Para moverlo posteriormente se puede hacer cambiando su posición con este método o usando modificadores de movimiento (MoveModifier en Andengine)
  • Actualizaciones: onManagedUpdate (float): Todo sprite tiene un hilo que se llama todo el rato para ir comprobando si tiene que hacer acciones. El método onManagedUpdate es un método que podremos sobreescribir para hacer acciones en el sprite tales como moverlo cada X segundos.
  • Eventos: onAreaTouched: Usado para detectar cuando el sprite ha sido pulsado por el usuario. Para que este evento tenga efecto en Andengine antes hay que decirle al motor que lo tenga en cuenta para el sprite. Esto se hace:
// Le decimos a la escena que register el evento "tocar" en el sprite1
mGameScene.registerTouchArea(sprite1);

Como habréis podido ver, este artículo tiene una foto de un juego, es uno de mis juegos educativos, Space4Kids. En su desarrollo usé la carga de sprites que explico en este tutorial y el scroll que explicaré en posteriores tutoriales.

Votos totales: 18