Por Nacho Cabanes
Incluir soporte de ratón en el juego. Por orden creciente de dificultad, debería afectar a:
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":
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...