¿Qué hará esta versión?

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

El mapa será capaz de informar de si es posible moverse a unas ciertas coordenadas dentro de él

Podemos crear una función "EsPosibleMover", que reciba las coordenadas límite de un rectángulo (el que ocuparía el personaje después de moverse, por ejemplo), y nos devuelva "true" si es una posición válida, o "false" cuando no lo sea (porque se solape con alguna casilla del fondo):

public bool EsPosibleMover(int x, int y, int xmax, int ymax)
{
   // Compruebo si choca con alguna casilla del fondo
   for (int fila = 0; fila < altoMapa; fila++)
          for (int colum = 0; colum < anchoMapa; colum++)
          {
              int posX = colum * anchoTile + margenIzqdo;
              int posY = fila * altoTile + margenSuperior;
              // Si no es espacio blanco
              if ((datosNivel[fila][colum] != ' ')
                  // Y se solapa con la posic a la que queremos mover
                  && (posX+anchoTile > x) && (posY+altoTile > y)  
                  && (xmax> posX) && (ymax > posY))
              {
                  return false;
              }
           }
 
   return true;
}
 

El personaje comprobará si se puede mover a una posición antes de hacerlo

Cuando se le pida mover a la derecha (o a cualquier otra dirección), comprobará primero si terminaría en una posición del mapa que realmente sea pisable:

public void MoverDerecha() 
{
    if (miPartida.GetMapa().EsPosibleMover(x + incrX, y, 
              x + ancho + incrX, y + alto))
          x += incrX;
}
 

Ésta es la versión 0.04, que puedes descargar en la página del proyecto en Google Code.

Siguiente entrega...