Tutorial de ZX Basic + Fourspriter #10: De charsets
23 febrero, 2012 Deja un comentario
Aunque para seguir con el ejemplo a nosotros nos sobra y nos basta con un set de UDG, vamos a hablar sobre una forma de tener más de 21 bloques (en concreto, hasta 96 más), así como de definir un nuevo tipo de letra para los textos de nuestro güego.
La idea es usar un set de caracteres completo en vez de un set de UDG. Un set de caracteres es prácticamente lo mismo que un set de UDG, con la diferencia de que define todos los carácteres con ASCII 32 a 127 (en total, 96 caracteres), que son estos:
Lo ideal y deseable es usar un set completo para definir un tipo de letra, y otro set completo para definir un set de gráficos. Cuando vayamos a imprimir un texto, activaremos el set del tipo de letra. Cuando vayamos a pintar las pantallas del mapa, activaremos el set de gráficos.
El tema se hace de una forma muy parecida a la de los UDG. ¿Recordáis como definíamos el tileset, con un byte para el color, seguido por el código ascii del UDG correspondiente? ¿Recordáis como usábamos también el 32, que es el ASCII del espacio? Pues igual, pero con el código correspondiente de 32 a 127 del carácter que tenemos que imprimir. Porque, recordemos, el set de caracteres y el set de UDG son completamente independientes. Además, nada nos impide combinar un set de caracteres con otro de UDG para tener 96+21 = 117 bloques.
Empezamos creando dos imagenes de 256×24 píxeles, una con el charset y otra con nuestro set de gráficos. Para hacer el set de gráficos, vamos diseñando tiles de 16×16, y vamos recortando los bloques de 8×8 que no estén todavía y pegando en el set… Vamos, como los UDG, solo que con 96 en lugar de 21.
Como véis, hay huecos libres en ambos. Bueno, da igual, no tengo tiempo de hacer más. El tema es convertir estos gráficos de la misma forma que convertimos el spriteset, o los UDG, y salvarlos en dos archivos charset-graficos.bas y charset-textos.bas. El primero debería definir un array tal que…
Dim charsetGraficos (767) as uByte => { _
Y el segundo uno muy parecido:
Dim charsetTextos (767) as uByte => { _
Para activar un charset u otro, hay que hacer uso de un POKE especial, de la misma pinta que el POKE para activar un set de UDG u otro, pero con dos particularidades: es a 23606 (esta vez la variable del sistema es CHARS) en vez de a 23675, y además tenemos que restar 256 de la dirección del array que estemos pokeando. Esto tiene un por qué, por supuesto: el primer gráfico que estamos definiendo es el 32. 32*8=256… El set de gráficos «verdadero» (con definiciones para los caracteres de 0 a 31, que en Spectrum no son imprimibles, sino que representan códigos de control) debería empezar, pues, 256 bytes más atrás… Paranoias. Pasa del tema. Acuérdate:
Poke uInteger 23606, @array (0) - 256
Donde array es el array con el set que queramos activar (charsetGraficos, o charsetTextos). Por cierto, el set estándar del Spectrum está en 15616 (en la ROM), por lo que para activarlo se haría un sencillo:
Poke uInteger 23606, 15616 - 256
Vamos a hacer una prueba. Escribe este programa y grábalo como test3.bas:
#include once "charset-graficos.bas" #include once "charset-textos.bas" Cls Poke uInteger 23606, @charsetGraficos (0) - 256 imprimeSet () Print Print Poke uInteger 23606, @charsetTextos (0) - 256 imprimeSet () Print Print Poke uInteger 23606, 15616 - 256 imprimeSet () Print Print End Sub imprimeSet () Dim i as uByte For i = 32 To 127: Print Chr (i);: Next i End Sub
Como véis, siempre se imprimen los mismos códigos de caracteres, pero según qué set esté activo, se mostrarán unos diseños u otros.
A la hora de hacer el tileset, se hace igual que antes, pero teniendo en cuenta que los códigos del charset van de 32 hasta 127. Por último, hay que acordarse de activar el charset gráfico antes de imprimir tiles hechos con caracteres modificados (obviamente).
Como hemos dicho, en este tutorial sólo usaremos nuestros UDG para este primer güego que estamos haciendo, pero nada te impide a tí seguir el tutorial usando charsets.
Comentarios recientes