¿Qué hará esta versión?

En los juegos de plataformas clásicos, era habitual que una pantalla de juego estuviera formada por casillas repetitivas, lo que simplifica la creación de niveles y además permite gastar menos memoria para almacenarla:

Pantalla del juego original, cuadriculada

Para imitarlo, vamos a hacer lo siguiente en nuestro juego:

Vamos a ver cómo se puede conseguir...

Crear una clase Mapa, que represente una pantalla de fondo formada por casillas repetitivas

Por ahora, la clase Mapa contendrá poco más que:

  • Un array que represente la distribución de casillas en la pantalla. Este podría ser un array bidimensional del enteros, o, más legible aún, de caracteres. La forma más cómoda de conseguirlo en C# puede ser usando un array de strings, de modo cada letra de cada línea corresponda a una casilla del fondo (por ejemplo, la L podría indicar dónde debe aparecer un ladrillo, y la V dónde debe haber una llave).
  • un constructor, que cargará las imágenes de esas casillas que dibujaremos más adelante.
  • Un método DibujarOculta, que se limitará a recorrer el array y dibujar una casilla u otra según corresponda, usando una orden "switch":

public class Mapa : ElemGrafico
{
    Partida miPartida;
 
    private int altoMapa = 16, anchoMapa = 32;
    private int anchoTile = 24, altoTile = 24;
    private int margenIzqdo = 20, margenSuperior = 100;
 
    ElemGrafico arbol, deslizante, ladrillo, ladrilloX, llave, puerta, 
        sueloFino, sueloFragil, sueloGrueso, techo;
 
    string[] datosNivel =
    {"L        V T    T            V L",
     "L               V              L",
     "L                              L",
     "L                              L",
     "L                      VA  A   L", 
     "LSSSSSSSSSSSSSFFFFSFFFFSSSSSSSSL", 
     "L                             VL", 
     "LSSS                           L", 
     "L                LLL A         L", 
     "LSSSS   DDDDDDDDDDDDDDDDDDDD   L", 
     "L                            SSL", 
     "L                              L", 
     "L            A      LLLFFFFFSSSL", 
     "L    SSSSSSSSSSSSSSS         PPL",
     "L                            PPL",
     "LSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSL"};
 
    // Constructor
    public Mapa(Partida p)
    {
        miPartida = p;   // Para enlazar con el resto de componentes
 
        arbol = new ElemGrafico("imagenes/arbol.png");
        deslizante = new ElemGrafico("imagenes/deslizante.png");
        ladrillo = new ElemGrafico("imagenes/ladrillo.png");
        ladrilloX = new ElemGrafico("imagenes/ladrillo2.png");
        llave = new ElemGrafico("imagenes/llave.png");
        puerta = new ElemGrafico("imagenes/puerta.png");
        sueloFino = new ElemGrafico("imagenes/suelo.png");
        sueloFragil = new ElemGrafico("imagenes/sueloFragil.png");
        techo = new ElemGrafico("imagenes/techo.png");
  }
 
  public void DibujarOculta()
  {
      // Dibujo el fondo
      for (int i = 0; i < altoMapa; i++)
          for (int j = 0; j < anchoMapa; j++)
          {
              int posX = j * anchoTile + margenIzqdo;
              int posY = i * altoTile + margenSuperior;
              switch (datosNivel[i][j])
              {
                  case 'A': arbol.DibujarOculta(posX, posY); break;
                  case 'D': deslizante.DibujarOculta(posX, posY); break;
                  case 'F': sueloFragil.DibujarOculta(posX, posY); break;
                  case 'L': ladrillo.DibujarOculta(posX, posY); break;
                  case 'P': puerta.DibujarOculta(posX, posY); break;
                  case 'S': sueloFino.DibujarOculta(posX, posY); break;
                  case 'T': techo.DibujarOculta(posX, posY); break;
                  case 'V': llave.DibujarOculta(posX, posY); break;
              }
          }
  }  
 
} /* fin de la clase Mapa */
 

Actualizar la clase Partida, para que use esta nueva clase

Por su parte, la partida tendrá muy pocos cambios: declarar el Mapa, inicializarlo en el constructor, y dibujarlo en el método correspondientes, así:

public class Partida
{
    // Componentes del juego
    private Personaje miPersonaje;
    private Enemigo miEnemigo;
    private Mapa miPantallaJuego;
    [...]
 
    public Partida()
    {
        miPersonaje = new Personaje(this);        
        miEnemigo = new Enemigo(this);
        miPantallaJuego = new Mapa(this);
        [...]
    }
 
    void dibujarElementos()
    {
        // Borro pantalla      
        Hardware.BorrarPantallaOculta(0,0,0);
 
        // Dibujo todos los elementos
        miPantallaJuego.DibujarOculta();
        miPersonaje.DibujarOculta();
        miEnemigo.DibujarOculta();        
 
        // Finalmente, muestro en pantalla
        Hardware.VisualizarOculta();        
    }
    [...]
 

El resultado podría quedar así:

Pantalla del juego, versión 0.03

Ésta es la versión 0.03 en la página del proyecto en Google Code.

Siguiente entrega...