domingo, 9 de abril de 2017

Last Crown Warriors #1: Creando el sistema de scroll

En el screenshotsaturday del 1 de abril publiqué un vídeo corto en el que se podía obervar el sistema de scroll y colisiones de Last Crown Warriors en acción.
En el vídeo podemos ver a Lilian desplazándose a una velocidad de 7 píxeles por frame a lo largo de un escenario de 512 por 512 píxeles. En esta entrada me dedicaré a explicar la lógica que hay detrás del sistema de scroll, que como veréis a continuación, permite un desplazamiento por frame de hasta 8 píxeles.

Lo primero que hay que entender a la hora de plantear un sistema de scroll para Game Boy es que, en esta consola, toda actualización gráfica que se realice con el LCD encendido debe producirse durante la interrupción de VBlank (o durante la interrupción de HBlank, aunque no la tenemos en cuenta para el scroll). Y es que esta interrupción marca el inicio de un periodo de tiempo en el que el sistema no está haciendo uso de la memoria de vídeo, periodo en el que por lo tanto tenemos disponible dicha memoria para modificarla.

Esta interrupción se produce 59,7 veces por segundo (una por cada frame del juego) en una Game Boy. Esta gráfica representa la duración de la interrupción (4.560 ciclos de reloj) respecto al total de tiempo que dura el frame (70.224 ciclos de reloj).

En base a estos datos podemos concluir que la actualización gráfica debe estar altamente optimizada.

Y lo segundo que necesitamos entender es cómo funciona el scroll de fondos en este sistema. El desplazamiento del fondo funciona a nivel de hardware, es decir, con cambiar el valor de un registro podremos alterar la posición del fondo que tengamos cargado en memoria. Pero el tamaño de este fondo es limitado, de 256 por 256 píxeles, así que para mapas que superen dichas dimensiones será necesario modificarlo.

La base del sistema de scroll será entonces el redibujado del fondo. Y teniendo en cuenta que la modificación gráfica debe ser lo más óptima posible, queda decidir qué parte del fondo debe actualizarse durante la interrupción. En Last Crown Warriors, actualizamos la columna y la fila visible de la parte del fondo a la que nos dirigimos. Por ejemplo, si nos dirigimos hacia arriba, hacia la izquierda, o hacia arriba y hacia la izquierda, actualizaremos la franja del fondo resaltada en la siguiente imagen. El recuadro azul respresenta en este caso el fondo visible.


Para el resto de direcciones actualizaremos la franja correspondiente siguiendo el mismo principio: actualizar la fila y columna más próxima a ser visible. Esta modificación íntegra de columna y fila nos permite un desplazamiento del fondo de hasta 8 píxeles por iteración.

Una vez tenemos claro qué tiles hay que sustituir, queda responder a la pregunta de cómo hacerlo. Como hemos visto, el tiempo disponible para modificar la memoria de vídeo es muy limitado. Por lo que en Last Crown Warriors se prepara una estructura de datos con la siguiente información, de cara a reducir al mínimo el tiempo que conlleva sustituir los tiles del fondo:
  • byte 0: parte baja de la dirección del tile a sustituir;
  • byte 1: parte alta de la dirección del tile a sustituir;
  • byte 2: nuevo valor del tile.
Esta estructura se repite por cada uno de los tiles que tenemos que actualizar, 41 en total. De esta forma, durante la interrupción de VBlank sólo debemos ejecutar el siguiente código, apuntando al inicio de la estructura de datos previamente preparada.


Usamos REPT para que el código señalado se repita por cada uno de los tiles. Desechando así un posible bucle, el cual consumiría procesamiento adicional.

Además es importante que en el caso de que usemos otras interrupciones de Game Boy ejecutemos "ei" (enable interrupts) al inicio de las mismas. De este modo nos aseguramos que la interrupción de VBlank se llama en el momento adecuado y que ninguna parte del código con el que actualizamos los gráficos se ejecuta fuera del periodo de VBlank.

Y esta sería una explicación conceptual de cómo funciona el sistema de scroll en este juego. En próximas entradas intentaré cubrir otros aspectos del desarrollo, de manera que no sea necesario tener unos conocimientos avanzados sobre el sistema para entender las ideas que se expongan.
 

No hay comentarios:

Publicar un comentario