09 octubre 2008

Remake (parcial) de Fruity Frank... 04 - Movimiento limitado

En la entrega anterior podíamos mover el personaje, pero nada impedía que no saliéramos de los límites de la pantalla de juego o incluso de la pantalla del ordenador. Vamos a hacer una pequeña mejora para evitarlo.

La idea es que cada vez que cambie una coordenada, por ejemplo xPersonaje, comprobaremos que su valor sea "razonable". Por ejemplo, la x no debería ser negativa, lo que podríamos conseguir con:

  if (xPersonaje < 0)
xPersonaje = 0;


Siendo estrictos, quizá la pantalla de nuestro juego no coincida por completo con la pantalla del ordenador, y, por tanto, no empiece justo en la posición 0. Entonces, una forma más genérica de conseguir lo anterior sería:

  if (xPersonaje < xIniPantalla)
xPersonaje = xIniPantalla;


En el lado contrario, la condición no es exactamente la misma: no nos basta con
if (xPersonaje > xFinPantalla) xPersonaje = xFinPantalla;
porque si situamos nuestro personaje a partir de xFinPantalla... ¡¡¡quedará fuera de la pantalla!!! Lo que debe coincidir con xFinPantalla es el último pixel de nuestro personaje, de modo que la comparación correcta sería:

  if (xPersonaje > xFinPantalla - anchoPersonaje)
xPersonaje = xFinPantalla - anchoPersonaje;


Como se ve, estamos utilizando más de una variable, que nos permitan controlar detalles como el ancho de nuestro personaje o los límites de la pantalla, de la forma más legible posible:

  int xPersonaje=340, yPersonaje=100;
int anchoPersonaje = 32, altoPersonaje = 32;
int xIniPantalla = 2, xFinPantalla = 638;
int yIniPantalla = 82, yFinPantalla = 448;


Ahora, cada vez que el usuario pulsa una tecla deberemos comprobar que el valor de x o y sea correcto antes de mover nuestro personaje a esa posición:

  if ( SDLA_teclaPulsada (TECLA_ARR) ) {
yPersonaje -= 4;
if (yPersonaje < yIniPantalla)
yPersonaje = yIniPantalla;
}


Para ver todo el proyecto en conjunto: code.google.com/p/fruityfrank