33. Volver a comenzar una partida. Una pantalla de presentación animada. Aplicación a MiniMiner (versión 6)

En este momento, nuestro juego permite agotar tres vidas, pero cuando acaban esas tres vidas, termina la partida y salimos del juego automáticamente.

Eso no es lo que suele ocurrir en un juego real: cuando agotamos nuestras vidas, deberíamos volver a la pantalla de presentación, y poder comenzar una nueva partida (con puntuación 0, con el personaje y los enemigos en su posición inicial, etc). No es difícil: basta con que la parte del juego que lanza la pantalla de presentación y luego el bucle principal se convierta en un bloque repetitivo: lo que antes era

int main()
{
    // Intento inicializar
    if (inicializa() != 0)
        exit(1);
 
    lanzarPresentacion();
    buclePrincipal();
 
    hard.pausa(1000);
    return 0;
}

ahora se repetirá hasta que en la presentación se escoja "Terminar":

int main()
{
    // Intento inicializar
    if (inicializa() != 0)
        exit(1);
 
    sesionTerminada = false;
    do
    {
        lanzarPresentacion();
        sesionTerminada = ( presentacion->escogidoFin() );
        if (! sesionTerminada)
        {
            buclePrincipal();
            reiniciarPartida();
        }
    }
    while (! sesionTerminada);
 
    return 0;
}

Ese nuevo método "escogidoFin" de la clase Presentación es el que indicaría si se ha pulsado la tecla de Terminar la partida (por ejemplo, la tecla T).


Hacer que la pantalla de presentación sea animada también es sencillo: basta con que en vez de terminar con un "esperarTecla", se repita con un "mientras no se pulse tecla", y que esa parte repetitiva mueva una imagen en pantalla. Esta imagen podría ser la "figura imposible" que aparecía junto al cartel de presentación del juego, y la forma de moverla podría ser aumentando su X y su Y hasta que llegue a los bordes de la pantalla, y haciendo que "rebote" en ese caso:

int Presentacion::mostrar(Hardware h) {
 
    int x=100, y=100; // Coordenadas del cartel movil
    int incrX = 2, incrY = 2; // Velocidad del cartel movil
 
    // Absorbo pulsaciones de teclas que lleguen desde el juego
    while ( h.algunaTeclaPulsada() ) 
        h.esperarTecla();
 
    do 
    {
        // Primero muestro el cartel antiguo
        h.borrarOculta();
        cartelFondo.moverA(0,0);
        h.dibujarOculta(cartelFondo);
 
        cartelMovil.moverA(x,y);
        h.dibujarOculta(cartelMovil);
 
        h.visualizarOculta();        
        h.pausa(40);
 
        x += incrX;
        y += incrY;
 
        // Invierto velocidad si llega al borde
        if ((x < 10) || (x > 640-10-174))
            incrX = - incrX;
        if ((y < 10) || (y > 480-10-179))
            incrY = - incrY;
    }
    while ( ! h.algunaTeclaPulsada() );
 
    tecla = h.esperarTecla();
}
 

Si queremos que la imagen sea transparente (para que no se borre el fondo al moverse sobre él), es algo que la mayoría de bibliotecas gráficas permiten hacer de una u otra forma. En el caso de Allegro, la función "draw_sprite" soporta transparencia de dos maneras distintas: o bien con el color 0 (si la imagen es de 256 colores) o bien el "rosa mágico" (255,0,255) si es una imagen "true color":

De modo que la presentación quedaría así:

Nuestro juego todavía no es jugable, pero no es conveniente hacer demasiados cambios en una misma versión, así que las mejoras de jugabilidad las dejamos para la siguiente entrega...