¿Qué hará esta versión?

Veamos cómo hacerlo...

Crear la clase Marcador

Queremos sacar todo lo relativo al "marcador" (vidas, puntos, energía, etc.) a una clase nueva, para que no se vaya complicando innecesariamente la función "DibujarElementos" de la partida.

De paso, aprovecharemos para mejorar un poco la apariencia: no sólo tendrá los métodos SetVidas, SetAire, SetPuntuacion que deben valor a estos atributos, sino que podemos incluir imágenes repetitivas para "dibujar" la cantidad de vidas restantes y (más adelante) el aire que queda, de modo que la apariencia sea:

Apariencia del juego, versión 0.10

Y el fuente que lo hace podría ser así:

public class Marcador
{
    private ElemGrafico imgVidas, imgEnergia;
    private ElemGrafico imgAireRojo, imgAireRojoVacio, imgAireVerde, imgAireVerdeVacio;
    private ElemGrafico imgFondoMetal;
    private int aire;
    private int puntuacion;
    private int mejorPunt;
    private int vidas;
 
    private Partida miPartida;
    Fuente tipoDeLetra;
 
    public void SetVidas( int valor )
    {
      vidas = valor;
    }
 
    public int GetVidas()
    {
      return vidas;
    }
 
    public Marcador(Partida p)
    {    
        miPartida = p;
        tipoDeLetra = new Fuente("FreeSansBold.ttf", 18);
        imgVidas = new ElemGrafico("imagenes/personaje.png");
        imgAireRojo = new ElemGrafico("imagenes/aireRojo.png");
        imgAireRojoVacio = new ElemGrafico("imagenes/aireRojoV.png");
        imgAireVerde = new ElemGrafico("imagenes/aireVerde.png");
        imgAireVerdeVacio = new ElemGrafico("imagenes/aireVerdeV.png");
        imgFondoMetal = new ElemGrafico("imagenes/metal.png");
    }
 
 
    /// Devuelve el valor del aire
    public  int GetAire()
    {
      return aire;
    }
 
 
    /// Cambia el valor del aire
    public  void SetAire(int valor)
    {
      aire = valor;
 
    }
 
    /// Incrementa el valor del aire
    public void IncrAire(int valor)
    {
        aire += valor;
    }
 
 
    /// Devuelve el valor de la puntuación
    public  int GetPuntuacion()
    {
      return puntuacion;
    }
 
 
    /// Cambia el valor de la mejor puntuación
    public  void SetMejorPuntuacion(int valor)
    {
      mejorPunt = valor;
    }
 
 
    /// Cambia el valor de la puntuación
    public  void SetPuntuacion(int valor)
    {
      puntuacion = valor;
    }
 
 
    /// Incrementa el valor de la puntuación
    public  void IncrPuntuacion(int valor)
    {
      puntuacion += valor;
    }
 
 
    public  void DibujarOculta()
    {
 
      // Carteles  
      //Hardware.EscribirTextoOculta("Vidas: " + miPartida.GetPersonaje().GetVidas(),
      //   280, 550, 0xAA, 0xAA, 0xAA, tipoDeLetra);
 
     Hardware.EscribirTextoOculta("Mejor puntuación: 000000",
         200, 520, 0xFF, 0xFF, 0x00, tipoDeLetra);
     Hardware.EscribirTextoOculta("Puntos: " + puntuacion.ToString("000000"),
         550, 520, 0xFF, 0xFF, 0x00, tipoDeLetra);
 
     // Borde superior e inferior y nombre de nivel (prefijado por ahora)
     imgFondoMetal.DibujarOculta(0, 0);
     imgFondoMetal.DibujarOculta(0, 420);
     Hardware.EscribirTextoOculta("Central Cavern",
         350, 430, 0,0,0, tipoDeLetra);
 
     // Medidor de aire
     int i;
     for (i = 0; i < 200; i++)
     {
         if (i < 25) imgAireRojo.DibujarOculta(i * 4, 460);
         else if (i < 60) imgAireRojoVacio.DibujarOculta(i * 4, 460);
         else if (i < 175) imgAireVerdeVacio.DibujarOculta(i * 4, 460);
         else imgAireVerde.DibujarOculta(i * 4, 460);
     }
     Hardware.EscribirTextoOculta("Aire",
      10, 464, 0, 0, 0, tipoDeLetra);
 
      // Vidas, como varias imagenes (maximo 5)
     int vidasMostrar = vidas;
     if (vidasMostrar > 5) vidasMostrar = 5;
     for (i = 0; i < vidasMostrar; i++)
     {
        imgVidas.DibujarOculta(20 + 40*i, 500);
     }
 
    }
} /* end class Marcador */
 

Cambios en "Partida": usar el marcador

Ahora la rutina de "DibujarElementos" ya no mostrará las vidas y los puntos directamente, sino que pasará esta información al Marcador, y dibujará el marcador:

// --- Dibujar en pantalla todos los elementos visibles del juego ---
void dibujarElementos()
{
    // Borro pantalla      
    Hardware.BorrarPantallaOculta(0,0,0);
 
    // Dibujo todos los elementos
    miPantallaJuego.DibujarOculta();
    miPersonaje.DibujarOculta();
    miEnemigo.DibujarOculta();
 
    // Y el marcador
    miMarcador.SetVidas(miPersonaje.GetVidas());
    miMarcador.SetPuntuacion(puntos);
    miMarcador.DibujarOculta();
 
    // Finalmente, muestro en pantalla
    Hardware.VisualizarOculta();        
}
 

(Por supuesto, también deberemos crear el Marcador en el constructor, etc).

Otros cambios menores

Hemos cambiado el tamaño del margen superior del juego. Deberemos reflejarlo en la coordenada Y inicial del personaje, del enemigo, y la posición inicial de nuestro mapa de casillas. Es un cambio muy pequeño, pero que no debemos pasar por alto.


Como en las entregas anteriores, puedes descargar la versión 0.10 completa en la página del proyecto en Google Code.

Siguiente entrega...