El trabajo propuesto

Incluir soporte de ratón en el juego. Por orden creciente de dificultad, debería afectar a:

  • En las pantallas de información, como la de "Créditos", bastará con hacer un clic en cualquier punto para volver a la pantalla de presentación.
  • En la pantalla de presentación, aparecerán botones que permitirán entrar a la partida, a los créditos, etc. cuando se haga clic sobre ellos.
  • En el juego, cuando se haga clic en cualquier punto de la pantalla, el personaje avanzará un paso en esa dirección, como si se hubiera pulsado la flecha en esa dirección.

Forma de conseguirlo

Nuestra clase Hardware no tiene soporte de ratón tal y como es ahora mismo, pero sí es una posibilidad incorporada en SDL (y por tanto en Tao.SDL), que podemos utilizar para crear una función "RatonPulsado":

if ((Sdl.SDL_GetMouseState(out posXraton, out posYraton) & Sdl.SDL_BUTTON(1)) == 1)

De modo que en la pantalla de "Créditos" podríamos comprobar si se ha pulsado ESC o el ratón, así:

 
// Se puede salir pulsando ESC 
salir = Hardware.TeclaPulsada (Hardware.TECLA_ESC); 
 
// O bien haciendo clic con el ratón 
int posXRaton, posYRaton; 
if (Hardware.RatonPulsado(out posXRaton, out posYRaton)) 
{ 
    salir = true; 
}
 

En cuanto a la pantalla de presentación, primero debemos diseñar, la nueva apariencia, que incluirá varios "botones":

Presentacion de la version 0.23

Y ahora comprobaremos no sólo las teclas, sino también las zonas en que se ha hecho clic:

 
if (Hardware.TeclaPulsada(Hardware.TECLA_C))
{
    finpresentacion = true;
    opcionEscogida = OPC_CREDITOS;
}
 
if ((posXRaton >= 430) && (posYRaton >= 550))
{
    if ((posXRaton <= 540) && (posYRaton <= 590))
    {
        finpresentacion = true;
        opcionEscogida = OPC_CREDITOS;
    }
}
 

Una primera aproximación puede ser comparar simplemente la x de nuestro personaje con la del ratón

 
// Compruebo el raton
int posXRaton, posYRaton;
if (Hardware.RatonPulsado(out posXRaton, out posYRaton))
{
    if (posXRaton > personaje.GetX()) personaje.MoverDerecha();
    if (posXRaton < personaje.GetX()) personaje.MoverIzquierda();
    if (posYRaton > personaje.GetY()) personaje.MoverAbajo();
    if (posYRaton < personaje.GetY()) personaje.MoverArriba();
}
 

Pero esto tiene un problema, que ya existía en la versión anterior del juego, pero que ahora resulta mucho más evidente: si se pulsaba la "flecha abajo" del teclado, el personaje se ponía en "posición de bajar", aunque no hubiera una escalera; ahora eso ocurre siempre, porque es muy difícil que hagamos clic exactamente en la misma coordenada X que la que tiene el personaje. Una forma de solucionarlo puede ser que sólo "cambie de dirección" si realmente se puede mover de una posición a la siguiente:

 
if (miPartida.GetMapa().EsPosibleMover(x, (short) (y-incrY),
          (short) (x+ancho),(short) (y+alto -incrY)))
{
      CambiarDireccion(ARRIBA);
      y -= incrY;
      SiguienteFotograma();
}
 

Ahora surge un nuevo problema: si no hacemos clic exactamente en la vertical (algo casi imposible), el personaje cambia de dirección dos veces... y avanza de fotograma dos veces... con lo que no se ve un cambio, sino que parece que permanece en el primer fotograma todo el tiempo. Una forma de evitarlo es que no cambie de dirección dos veces, por ejemplo mirando si se ha hecho clic a mayor distancia horizontal o vertical, y dando por sentado que esa mayos distancia indica la dirección en la que el usuario desea que se mueva el personaje:

 
if (Hardware.RatonPulsado(out posXRaton, out posYRaton))
{
    int distanciaX = Math.Abs( posXRaton - personaje.GetX() );
    int distanciaY = Math.Abs( posYRaton - personaje.GetY() );
 
    if (distanciaX > distanciaY)  // Movimiento horizontal
    {
        if (posXRaton > personaje.GetX()) personaje.MoverDerecha();
        if (posXRaton < personaje.GetX()) personaje.MoverIzquierda();
    }
    else  // Movimiento vertical
    {
        if (posYRaton > personaje.GetY()) personaje.MoverAbajo();
        if (posYRaton < personaje.GetY()) personaje.MoverArriba();
    }
}
 

De paso, esta versión incluye el proyecto en el formato de Visual Studio 2008, para poder practicar también con este entorno.

Puedes descargar todo el paquete de la versión 0.23, con todos los fuentes, el ejecutable (en la carpeta BIN/DEBUG), las imágenes, la documentación hasta la fecha y el proyecto de SharpDevelop1 y el de Visual Studio 2008, pero SIN LAS DLL en un fichero ZIP de tamaño cercano a 800 Kb. Si no tienes las DLL de alguna versión anterior del proyecto, también puedes descargarlas en un fichero ZIP de tamaño cercano a 900 Kb.

Siguiente entrega...