Tutorial de ZX Basic + Fourspriter #12: Dibujando pantallas

Ahora que tenemos nuestro mapa.bas en /dev, lo primero que tendremos que hacer será incluirlo en nuestro código. En la lista de includes de test2.bas añadimos el archivo con el mapa como siempre:

'' test2.bas
''
'' Nuestro segundo programa con Fourspriter.

#include once "fsp2.1.bas"
#include once "spriteset.bas"
#include once "udg.bas"
#include once "tileset.bas"
#include once "mapa.bas"

Ahora, para que nuestro código sea reutilizable, vamos a crear unas cuantas constantes con las diferentes dimensiones de la pantalla. ¿Por qué constantes y no variables? Pues porque las constantes se sustituyen por el numerico en sí en tiempo de compilación (ya que nunca van a cambiar) y, por tanto, funcionan más rápido. Nos creamos un área para constantes justo debajo de los includes, para ser ordenados:

'' Constantes

Const MAPSCREENWIDTH As uByte = 12
Const MAPSCREENHEIGHT As uByte = 12
Const TILESIZE As uByte = 2

Hemos creado tres constantes: las dos primeras almacenan el tamaño en tiles de cada pantalla, a lo ancho y a lo alto. La tercera constante indica el tamaño de cada tile (2×2 caracteres, en nuestro caso).

Escribir una rutina que imprima una pantalla es muy sencillo, como hemos dicho. Si echáis un vistazo a mapa.bas, veréis que el mapa es un array con un montón de números. Cada linea de ese array es una pantalla completa (habrá, en nuestro caso, 12×12=144 numeritos por linea), y cada numerito es un tile, ordenados de izquierda a derecha y de arriba a abajo.

Para imprimir una pantalla, por tanto, habrá que dibujar MAPSCREENWIDTH * MAPSCREENHEIGHT (12×12 = 144) tiles a partir del índice n * MAPSCREENWIDTH * MAPSCREENHEIGHT (n * 144) del array, siendo n el número de pantalla.

He escrito esta pequeña Sub que se encarga de hacer eso, y dibuja la pantalla «n» del mapa en la posición (x, y) que le indiques. Como ves, antes de empezar precalcula algunas cosas para ir un poco más rápido, aunque ya veremos que la velocidad tampoco va muy allá. Para conseguir un mapeador rápido habrá que hacerlo en ensamblador, pero eso ahora mismo se escapa un poco del objetivo del tutorial.

El código es el siguiente:

Sub pintaMapa (x as uByte, y as uByte, n as uInteger)
   Dim idx as uInteger
   Dim i as uByte
   Dim screenSize as uByte
   Dim mapScreenWidthInChars as uByte
   Dim xx, yy as uByte
   ' Size in bytes:
   screenSize = MAPSCREENWIDTH * MAPSCREENHEIGHT
   mapScreenWidthInChars = TILESIZE * MAPSCREENWIDTH
   ' Read from here:
   idx = n * screenSize
   ' Loop
   xx = x
   yy = y
   For i = 1 To screenSize
      pintaTile (xx, yy, mapa (idx))
      xx = xx + TILESIZE
      If xx = x + mapScreenWidthInChars Then
         xx = x
         yy = yy + TILESIZE
      End If
      idx = idx + 1
   Next i
End Sub

No es difícil de seguir. Es un bucle de MAPSCREENWIDTH * MAPSCREENHEIGHT iteraciones que va dibujando los tiles en la pantalla. Antes de empezar se calcula idx, un índice del array, y en cada vuelta del bucle se va incrementando para leer el tile correcto. Con cada tile, se llama a pintaTile para ponerlo en la pantalla. Y poco más.

Si llamamos a pintaMapa (4, 0, 1), por ejemplo, pintaremos la pantalla 1 del mapa en la posición (4, 0) (o sea, centrado para nuestro ejemplo).

 

Como siempre, pulsad aquí para descargar todo en el paquetico de este capítulo. Para el siguiente, vamos a empezar a empaquetar todas estas funciones en un archivo engine.bas, ya que vamos a empezar a hacer un güego, y a nosotros nos gusta mucho reutilizar rutinas, ¿no?

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: