16 octubre 2008

Remake (parcial) de Fruity Frank... 06 - Transparencia y tiempo "fiable"

Vamos a hacer dos pequeñas mejoras:


  • Al mover nuestro personaje, se mueve también el recuadro negro que lo rodea. Quedaría mucho mejor si ese recuadro negro no se viera, sino que nuestro personaje pareciera estar directamente sobre el fondo. Eso es fácil de conseguir: no podemos usar imágenes en formatos que tengan transparencia, como el PNG o el GIF (al menos por ahora), porque la versión básica de la biblioteca SDL sólo soporta el formato BMP, pero sí podemos indicar que uno de los colores que forman la imagen sea tratado como transparente.

  • La velocidad de nuestro juego depende de la velocidad del ordenador en el que lo probemos, hasta el punto de que puede resultar "injugable" en un ordenador muy rápido, y eso no debería ocurrir.




Para el primero de esos puntos, la transparencia, tenemos una orden en SDL ("ocultada" dentro de las funciones en español que tenemos listas para usar) que permite indicar qué color será considerado transparente, a partir de sus componentes RGB (rojo, verde, azul, indicados entre 0 y 255). Por ejemplo, si queremos que los puntos negros de la imagen sean considerados como transparentes, usaremos el color (0,0,0), o si queremos que lo sea el rojo puro, emplearemos (255,0,0).

En el caso de Fruity Frank, nuestro personaje tiene el pelo rojo y ropa azul, así que podemos usar el verde puro (0,255,0) para indicar los puntos transparentes. Editamos nuestra imagen desde cualquier editor gráfico (incluso el propio "Paint" de Windows serviría) y pintamos en color verde intenso el contorno de nuestro personaje, que antes era negro. Después le indicamos a nuestro juego que no dibuje ese verde, con:

    personaje=SDLA_cargarImagen("personaje1.bmp");
SDLA_colorTransparente(personaje, 0,255,0);


De igual modo, nuestro primer enemigo tiene zonas rojas, blancas, negras... así que el verde volvería a ser una buena elección para hacer su contorno transparente.

Por otra parte, para que la velocidad sea "casi igual" en cualquier ordenador, añadiremos una pausa entre un "fotograma" del juego y el siguiente. Si queremos que la visualización del juego tenga la velocidad habitual, 25 fotogramas por segundo, y suponemos que el tiempo que se pierde en redibujar la pantalla y en el análisis de la lógica de juego es despreciable, deberíamos hacer una pausa de 40 milisegundos tras cada redibujado de pantalla (1 segundo = 1000 milisegundos; 1000 ms / 25 fps = 40 ms entre un "fotograma" y otro):

    // Pausa de 40 ms, para velocidad de 25 fps (1000/40 = 25)
SDLA_pausa(40);



Como siempre, todo el proyecto está en: code.google.com/p/fruityfrank