domingo, 1 de enero de 2017

Super PepeToni -making off- 3 Sprites

Programar para la GameBoy tiene sus pros y sus contras.

Como pros hay que destacar que al contar con tan poca resolución de pantalla (160x140 píxieles) y tener un tamaño de sprites tan pequeño (8x8 o 8x16 píxeles) es viable encargarse de la parte de programación y gráficos a la vez, sin que esto segundo suponga una carga excesiva de trabajo. Vamos que con relativamente poco tiempo se pueden dibujar algunas cosas chulis.

Como contras está todo lo demás.

Pero en esta entrada no voy a hablar sobre las grandes carencias de este hardware sino sobre los sprites, o mas concretamente, las limitaciones y particularidades que atañen a estos.

Pero primero de todo ¿Que es un sprite? O mas bien ¿Que diferencia existe entre una imagen "normal" o un sprite?

Una imagen normal no es mas que un vector (Estructura de datos ordenada e indexada) que contiene tanto los metadatos de la imagen (Tamaño, peso, colores y etc) así como la información relativa a cada uno de sus píxeles. De esta manera, cuando mas gran grande es una imagen mas grande será este vector. Esta estructura se puede contemplar con facilidad en el formato de imagen bitmap . 



Cuando se usan imágenes/bitmaps, cada "entidad" corresponde a una 
imagen o parte de ella.  
Fijaos que cada frame ocupa el tamaño que necesita libremente.
Esto es lo que se usa actualmente en la programación moderna. 




En cambio un sprite es una estructura de datos que apunta a una imagen con una serie de "condiciones". Por ejemplo, debe de estar compuesta por un numero de píxeles definido, o solamente puede incluir una cantidad de colores determinada. 
Todas estas reglas se establecen porque, a diferencia de un bitmap, hay una parte del hardware denominada memoria de vídeo que se dedica exclusivamente a procesar estos sprites, liberando al procesador principal de esta ardua tarea. 

Un sprite ocupa lo mismo que cualquier otro sprite porque sólo es información de coordenadas en la pantalla mas un dato que indica a que imagen referencia. Esta imagen que es la que tiene que cumplir con esa serie de "requisitos" y se le denomina tile.

Representación de la memoria de vídeo de la GameBoy corriendo Super PepeToni. 
Fijaros que, a diferencia de la imagen anterior, todas las celdas miden exactamente lo mismo. 
Para formar un sprite grande, se deben ir seleccionando aquellas imágenes/tiles que corresponden.



La conclusión es que una imagen de tipo bitmap es mas detallada que un sprite porque existe "libertad" a la hora de construirla, pero también es mas lenta de procesar.

GameBoy usa sprites y por lo tanto hay una parte de su "circuiteria" que está dedicada al procesamiento de estos. Como el uso de sprites va fuertemente ligado a los videojuegos,  antiguamente, los sprites eran algo casi exclusivo de las consolas y es por esto que una GameBoy, con un un procesador algo inferior al del ZX Spectrum, por ejemplo, lograba juegos con personajes mas rápidos. El truco estaba en el uso de los sprites.


Limitaciones.

La principal limitación de la GameBoy para usar sprites es que sólo puede usar un máximo de 40. Aunque 40 sprites parezca un número mas o menos alto, en realidad no lo es. Como he explicado antes, un tile de la GameBoy puede medir 8x8 o 8x16 píxeles, y este es un tamaño muy pequeño.

El resultado final de toda esta fiesta es que para hacer un personaje de un tamaño considerable se necesitan usar varios sprites. En el caso de Super PepeToni son 10. Vamos, que el solito ya consume 10 de los 40 disponibles. O expresado de otro modo: El personaje principal, sin ser exageradamente grande, se come el 25% del total de los sprites...





Al añadir los enemigos he llegado al tope de los sprites que puedo usar: El personaje principal  mas tres enemigos distintos (He tenido que elegirlos muy bien) Si que es cierto que en realidad se puede representar como el personaje principal mas 6 enemigos, ya que por cada enemigo "guardo" un sprite extra para poder pintarlo 2 veces simultaneas. Osea puedo mostrar los 3 enemigos por 2 veces cada uno de ellos. Y todo eso a la vez. guau.

Guardaré un minuto de silencio por todas aquellas eminencias que, por
motivos técnicos, han quedado fuera :(


En realidad, se pueden crear mas tipos de enemigos "reciclando" sprites que para ser usados en varios personajes. Es decir, puedo reservar un grupo sprites para pintar enemigos del tipo 1 y tipo 2, siempre y cuando no los pinte a la vez.

Esto ultimo ya entra dentro de las clásicas triquiñuelas que se usaban para exprimir el hardaware al máximo, una tarea que resulta ardua pero que ofrece una compensación muy gratificante.

Y bueno, de momento eso es todo por hoy. Nos vemos en la siguiente entrada.