El trabajo propuesto

Ahora mismo, existe una pantalla de fondo, que muestra paredes, suelo, escaleras... pero el personaje se mueve sin tener en cuenta esos detalles. Por eso, en esta entrega, el personaje deberá moverse por las casillas reales de la pantalla, sin pisar paredes ni suelO, sino sólo donde haya espacio en blanco o paredes.

Como forma sencilla de plantear un primer acercamiento, el personaje no tendrá un movimiento suave, sino que "saltará" de una casilla a otra.

Forma de conseguirlo

Ahora la "x" y la "y" de nuestro personaje aumentarán (o disminuirán) de uno en uno, y antes de permitir que cambie deberemos comprobar si la correspondiente casilla del mapa está libre, con algo como:

 
if (Hardware.TeclaPulsada(Hardware.TECLA_DER) )
  if (x < maxX)
    if ((mapa[y,x+1] == 0)  // Espacio en blanco
      || (mapa[y,x+1] == 4) )// Escalera
        x++;
 

El fuente completo podría quedar así (el fichero ZIP que contiene las imágenes, DLLs y demás ficheros necesarios los tienes en la entrega 1):

/** 
 *   Juego: Logica de juego
 *  
 *   @see Hardware
 *   @author 1-DAI IES San Vicente 2009/10
 */
 
/* --------------------------------------------------         
   Parte de Death Pit - Remake
   Versiones hasta la fecha:
 
   Num.   Fecha       Por / Cambios
   ---------------------------------------------------
   0.01  08-Sep-2009  Nacho Cabanes
                      Version inicial: muestra una imagen
   0.02  07-Oct-2009  Nacho Cabanes
                      Mueve el personaje hacia la derecha
                        hasta llegar al margen
   0.03  13-Oct-2009  Nacho Cabanes
                      El personaje se mueve con flechas
                      Un primer enemigo que se mueve a la vez
   0.04  16-Oct-2009  Nacho Cabanes
                      Primera pantalla de presentacion
                      El primer enemigo rebota en los lados
                      Un segundo enemigo nos persigue
   0.05  20-Oct-2009  Nacho Cabanes
                      Array de enemigos (murcielagos)
                       que rebotan en los lados
   0.06  28-Oct-2009  Nacho Cabanes
                      Array bidimensional para imagen de fondo
   0.07  04-Nov-2009  Nacho Cabanes
                      El personaje se mueve solo por los "huecos"
                      Eliminados los enemigos (por ahora)
                      Renombradas variables i,j a fila,colum
 
 ---------------------------------------------------- */
 
 using System; // Para numeros aleatorios: System.Random
 
public class Juego
{
 
    private static void Main()
    {
        // Variables que usaremos: una imagen y un tipo de letra
        ElemGrafico imagenPersonaje,
          presentacion;
        ElemGrafico imagenFondoHoriz,imagenFondoHorizAcido,
          imagenFondoVert, imagenEscalera;
        Fuente fuente18;
        int fila, colum;  // Para recorrer 
 
        short x=1, y=1;
        int minX = 0, maxX = 6,
          minY = 0, maxY = 6;
 
        int filasPantalla = 7;
        int columnasPantalla = 7;
 
        int[,] mapa = {
          {1,2,1,1,1,2,1},
          {0,0,0,0,0,0,0},
          {1,1,3,4,3,1,1},
          {0,0,3,4,3,0,0},
          {1,4,1,4,3,4,3},
          {0,4,3,4,3,4,3},
          {1,1,3,4,3,4,3}
        };
 
 
        // Inicializo modo grafico 800x600 puntos, 24 bits de color
        Hardware.Inicializar(800, 600, 24);
 
        // Cargo imagenes y tipos de letra
        imagenPersonaje = new ElemGrafico("imagenes/personaje.png");
 
        imagenFondoHoriz = new ElemGrafico("imagenes/fondo1.png");
        imagenFondoHorizAcido = new ElemGrafico("imagenes/fondo2.png");
        imagenFondoVert = new ElemGrafico("imagenes/fondo3.png");
        imagenEscalera = new ElemGrafico("imagenes/escalera.png");
 
 
        fuente18 = new Fuente("FreeSansBold.ttf", 18);
        presentacion = new ElemGrafico("imagenes/present.png");
 
        //dibujo la presentacion
        presentacion.DibujarOculta();
 
        // Finalmente, muestro en pantalla
        Hardware.VisualizarOculta();  
 
        //hasta que se pulse espacio
        do {
 
        } while (! Hardware.TeclaPulsada(Hardware.TECLA_ESP) );
 
        //borro la presentacion
        Hardware.BorrarPantallaOculta(0,0,0);
 
        // Y espero a que se pulse ESC
        do {
 
          Hardware.BorrarPantallaOculta(0,0,0);
 
          // Dibujo el fondo de la pantalla
          for (fila=0; fila<filasPantalla; fila++)
            for (colum=0; colum<columnasPantalla; colum++)
              switch (mapa[fila,colum]) {
 
                case 0:  // Espacio en blanco, no dibujo nada
                    break;
 
                case 1:
                    imagenFondoHoriz.MoverA( (short) (colum*70) , (short) (fila*50));
                    imagenFondoHoriz.DibujarOculta();
                    break;
 
                case 2:
                    imagenFondoHorizAcido.MoverA( (short) (colum*70) , (short) (fila*50));
                    imagenFondoHorizAcido.DibujarOculta();
                    break;
 
                case 3:
                    imagenFondoVert.MoverA( (short) (colum*70) , (short) (fila*50));
                    imagenFondoVert.DibujarOculta();
                    break;
 
                case 4:
                    imagenEscalera.MoverA( (short) (colum*70) , (short) (fila*50));
                    imagenEscalera.DibujarOculta();
                    break;
 
              }
 
          // Dibujo el personaje, el enemigo y un texto en la pantalla oculta
          imagenPersonaje.MoverA( (short) (x*70) , (short) (y*50) );
          imagenPersonaje.DibujarOculta();
 
          Hardware.EscribirTextoOculta(
                "Pulsa ESC para salir",
                300, 500, 0xAA, 0xAA, 0xAA, fuente18);
 
          // Finalmente, muestro en pantalla
          Hardware.VisualizarOculta();        
 
          // Y lo muevo si se pulsa alguna flecha del teclado
          if (Hardware.TeclaPulsada(Hardware.TECLA_DER) )
            if (x < maxX)
              if ((mapa[y,x+1] == 0)  // Espacio en blanco
                || (mapa[y,x+1] == 4) )// Escalera
                  x++;
 
          if(Hardware.TeclaPulsada(Hardware.TECLA_ARR) )
            if ( y > 0)
              if ((mapa[y-1,x] == 0)  // Espacio en blanco
                || (mapa[y-1,x] == 4) )// Escalera
                  y--;
 
          if (Hardware.TeclaPulsada(Hardware.TECLA_IZQ) )
            if ( x > 0)
              if ((mapa[y,x-1] == 0)  // Espacio en blanco
                || (mapa[y,x-1] == 4) )// Escalera
                  x--;
 
          if (Hardware.TeclaPulsada(Hardware.TECLA_ABA) )
            if (y < maxY)
              if ((mapa[y+1,x] == 0)  // Espacio en blanco
                || (mapa[y+1,x] == 4) )// Escalera
                  y++;
 
          // Pausa para 25 fps
          Hardware.Pausa( 40 );
        } while (! Hardware.TeclaPulsada(Hardware.TECLA_ESC) );
 
    }
 
} /* fin de la clase Juego */
 

Siguiente entrega...