28 octubre 2008

Remake (parcial) de Fruity Frank... 09 - Obstáculos, premios y texto

Con la estructura que tenemos hasta ahora, es fácil comprobar si hay un obstáculo en algún punto de la pantalla de juego.

La diferencia con lo que hemos hecho para "recoger premios" es que antes comprobábamos lo que había en una casilla cuando acabábamos de entrar a ella. Por el contrario, si se trata de un obstáculo, no deberíamos movernos a esa casilla, sino comprobar antes. Pero es fácil: ya estábamos comprobando si podíamos desplazarnos a una cierta posición de la pantalla o si estaba fuera de los márgenes, así que ahora es sólo añadir una condición más:

        if ( SDLA_teclaPulsada (TECLA_ARR) ) {
if ((yPersonaje > 0)
&& (mapa1[yPersonaje-1][xPersonaje] != 'M'))
yPersonaje --;
}


En esta expresión hay algo que puede desconcertar: si estamos en la columna 0... ¿no sería peligroso mirar en "mapa1[yPersonaje-1][xPersonaje]", es decir, en la columna "-1"? La respuesta es que NO: los compiladores de C evalúan las condiciones usando la técnica de "evaluación en cortocircuito": si se trata de dos condiciones unidas por un "Y" (&&) y la primera condición es falsa, no se molestan en comprobar la segunda condición, porque ya se sabe que el resultado de la condición global será "falso". Por eso, si estamos en la columna 0, no se llegará a comprobar qué habría en la columna -1.

Las demás comparaciones son similares a la anterior:

        if ( SDLA_teclaPulsada (TECLA_ABA) ) {
if ((yPersonaje < MAXFILAS-1)
&& (mapa1[yPersonaje+1][xPersonaje] != 'M'))
yPersonaje ++;
}



De paso, podemos hacer otra mejora: mostrar los puntos que vamos obteniendo durante el juego.

Eso supone dos pequeños cambios. El primero es declarar y cargar nuestro tipo de letra al principio del programa:

    SDLA_Fuente* SDLA_arial14;
SDLA_arial14 = SDLA_cargarFuente("arial.ttf",14);


El segundo es usar la función de "EscribirTextoOculta" para escribir textos, o "EscribirLongOculta" para escribir números (enteros largos):

        SDLA_escribirTextoOculta("Puntos",20,60,0x88FFFF, SDLA_arial14);
SDLA_escribirLongOculta(puntos,70,60,0xFFFF88, SDLA_arial14);


Por supuesto, cada vez que recojamos una cereza deberíamos obtener puntos, para que ese marcador aumente... pero eso ya no es difícil de hacer a esta altura.

(Nota: eso de poder escribir números ha supuesto hacer un cambio en los ficheros auxiliares SDL_ASI.h y sdlasi.c; tendrás que incluir en el proyecto los ficheros actualizados, o no compilará...)