Tutorial de ZX Basic + Fourspriter #8: UDG más virgueros
22 febrero, 2012 Deja un comentario
Vamos a hacer esto de una forma más virguera. Vamos a definir nuestros 21 UDG (8×21 = 168 bytes) en un array y le vamos a decir al Spectrum que los UDG están justo donde está nuestro array. Básicamente definiremos un array con todos los UDG y luego estableceremos INICIO_UDG a la dirección de memoria donde está dicho array. Y los UDG los haremos en nuestro editor gráfico favorito, los grabaremos en png, y luego los convertiremos con SevenuP.
Empezamos creando una imagen de 168×8 píxels donde pintaremos nuestros 21 UDG, y la grabamos en /gfx como udg.png. En el ejemplo, he usado bloques que luego podamos emplear para crear escenarios:
Ahora abrimos SevenuP y seguimos los mismos pasos que cuando convertimos spriteset-import.png, o sea:
- Abrir SevenuP.
- Pulsar I de IMPORTAR. Seleccionar udg.png y abrirlo.
- File->Output Options y dejarlo todo así:
- File->Export Data, Cambiar el tipo a «C» y grabar un udg.c.
Una vez obtenido udg.c, habrá que editarlo igual que el spriteset para convertirlo a código BASIC y grabarlo en /dev como udg.bas. Debería haberte quedado más o menos así: udg.bas.
De acuerdo. Ya tenemos nuestro array con los UDG. Ahora lo que tenemos que hacer es incluirlo en nuestro test1.bas para que el array esté disponible. Añadimos un include once al principio de test1.bas… Ahora mismo lo tendríamos que tener más o menos así (el principio del archivo):
'' test1.bas '' '' Nuestro primer programa con Fourspriter. #include once "fsp2.1.bas" #include once "spriteset.bas" #include once "udg.bas" Dim x, y, mx, my as uByte ... etc
El siguiente paso es, como dijimos, cambiar el INICIO_UDG que consulta PRINT a la hora de imprimir un UDG. Ese INICIO_UDG no es más que una dirección de memoria, como dijimos: la dirección de memoria donde está el primer byte de nuestros gráficos. Por tanto, tendremos que hacer que INICIO_UDG sea igual a la dirección de memoria donde está nuestro array «udg«.
¿Cómo hacemos eso? Muy sencillo. INICIO_UDG es un número de 16 bits que está almacenado en las posiciones de memoria 23675 y 23676 del Spectrum. De hecho, es lo que se llama una variable del sistema, en concreto se llama UDG (si te interesan las variables del sistema, mira aquí). Hay muchas variables del sistema que pueden sernos muy útiles, de hecho en siguientes capítulos descubriremos otras.
ZX Basic tiene una forma de escribir de una tacada un número de 16 bits en una posición de memoria y la que le sigue: Poke uInteger. Lo que haremos será ejecutar Poke uInteger pasándole la dirección de la variable del sistema UDG (23675) y la dirección de inicio de nuestro array «udg» (o sea, @udg(0), como en el caso de los sprites).
Ni cortos ni perezosos, activaremos nuestros UDG con un simple:
Poke uInteger 23675, @udg (0)
Una vez hecho esto, los siguientes PRINT que impriman UDGs lo harán usando nuestro set de gráficos definido en el array udg. Así de fácil.
Briconsejo
Esto nos permite tener varios sets de gráficos. Imaginaos que los hemos hecho en los arrays set1 y set2. Entonces actuaríamos así:
Poke uInteger 23675, @set1 (0) Print "Esto es del set1: \a\b\c\d" Poke uInteger 23675, @set2 (0) Print "Esto es del set2: \a\b\c\d"El primer PRINT usaría los UDG de set1, porque son los que están activos a la hora de ejecutarse. Lo mismo con el segundo PRINT: imprimiría los UDG de set2, que es el que está activo en ese momento.
Con esto, podemos adornar nuestro ejemplo haciendo un marco de ladrillicos:
Dim i as uByte ... For i = 0 To 31 Print At 0, i; "\{p4}\{i1}\a" Print At 23, i; "\{p4}\{i1}\a" Next i For i = 0 To 23 Print At i, 0; "\{p4}\{i1}\a" Print At i, 31; "\{p4}\{i1}\a" Next i
Esos \{pX} e \{iX} son códigos de control muy útiles: el primero establece un PAPER y el segundo un INK. \{p4} significa PAPER 4. \{i1} significa INK 1. Estos PRINT imprimirán el udg \a (el primero: los ladrillicos) en tinta azul sobre papel verde.
Esto nos va quedando así:
Fijaos como cuando se topa con los ladrillos, el PAPER de fondo del sprite cambia para adaptarse. Para descargar el paquetito con los ejemplos de este capítulo, haz click aquí.
Comentarios recientes