Por Nacho Cabanes
Veamos cómo hacerlo...
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:
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 */
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).
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.