Tutorial de ZX Basic + Fourspriter #12: Dibujando pantallas
24 febrero, 2012 Deja un comentario
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?
Comentarios recientes