48. Segundo juego completo en modo gráfico.

Llega el momento de juntar todo lo que hemos visto, para crear un "juego de plataformas clásico", en el que el usuario tenga que recoger premios, esquivar enemigos y avanzar de pantalla...

A partir de la última versión, no son necesarios grandes cambios. Por una parte, podemos aprovechar para cambiar el tipo de letra de los mensajes y alguna imagen:

FreddyTwo presentacion

Por otra parte, podemos hacer pequeñas mejoras. Por ejemplo, en la clase Hardware podemos añadir un método "EscribirTextoOcultaSombra", que nos permita escribir un texto "con sombra" (escribiendo primero un texto en otro color, ligeramente desplazado), para que los textos sean más legibles cuando se escriban sobre un fondo de color poco uniforme:

FreddyTwo creditos

Además, al terminar la partida, la pantalla de juego se cierra demasiado rápido. Podemos hacer una pequeña pausa y mostrar un texto de aviso:

FreddyTwo final

También podemos añadir algún nivel más. Para comprobar que todos los niveles se puedan resolver, nos puede interesar crear algún "modo de trampa", que nos permita avanzar de un nivel al siguiente, sin necesidad de resolver por completo el actual (por ejemplo, pulsando simultáneamente las teclas T+N) o recuperar alguna vida (por ejemplo, con T+V):

if ((Hardware.TeclaPulsada(Hardware.TECLA_T) && Hardware.TeclaPulsada(Hardware.TECLA_N)))
    miNivel.Avanzar();
 
if ((Hardware.TeclaPulsada(Hardware.TECLA_T) && Hardware.TeclaPulsada(Hardware.TECLA_V)))
    vidas++;

Y siempre quedan pequeñas cosas que corregir. Por ejemplo, el personaje "parecía hundirse" en el suelo al terminar un salto, porque su tamaño no era el correcto (aparecía 23 como alto, en vez de 30). Si corregimos esto, ahora, al terminar un salto puede quedar un poco separado del suelo, porque el movimiento del salto es irregular y quizá no termine en la misma altura que empezó; lo podemos mejorar, haciendo que el personaje no necesariamente caiga todo lo que indica su "incrY", sino que también pueda bajar un pixel:

if (miPartida.EsPosibleMover(x, y + incrY,
                    x + ancho, y + alto + incrY))
                Caer();
            else  // Si todavía no toca suelo, pero está cerca
                if (miPartida.EsPosibleMover(x, y + 1,
                        x + ancho, y + alto + 1))
                    y++;
 

Son cambios de poca importancia, pero si quieres descargarlo todo junto, aquí tienes todo el proyecto, incluyendo fuentes y ejecutable.

Ejercicio propuesto: Añade más niveles al juego (editando el fichero "niveles.dat" con cualquier editor de texto). Asegúrate de que son superables.