Tema 13 - Redefiniendo tipos de letra
- 13.1 Modificar una letra: SYMBOL
- 13.2 Un pequeño diseñador
- 13.3 Modificar muchas: SYMBOL AFTER
- 13.4 Posibles problemas
- 13.5 Ejercicio propuesto
- 13.6 Usar una hoja de cálculo para redefinir caracteres
13.1 Modificar una letra: SYMBOL
Podemos crear nuestros propios caracteres, basicamente por dos motivos:
- Usar un tipo de letra distinto el habitual, y así dar más vistosidad a un programa "de texto".
- Imitar "dibujos" usando caracteres, para crear cierto tipo de gráficos de forma sencilla. Es una de las posibles maneras (quizá la más limitada) de crear personajes móviles para un juego.
Pues crear un carácter "a medida" es sencillo: usamos la orden SYMBOL, a la que le indicamos el número de carácter a modificar, y 8 datos, para indicar la forma de cada una de las 8 filas que lo forman (un carácter en un CPC tiene 8 píxeles de ancho y 8 de alto).
En principio, podemos redefinir los caracteres 240 al 255 (más adelante veremos cómo cambiar otros). En cuanto a los datos de cada fila, la forma más intuitiva (pero también la que más espacio ocupa) es indicarla en binario: un 1 para cada punto visible y un 0 para cada punto no visible, así:
SYMBOL 240, &x11111111, &x10000001, &x10000001, &x10000001, &x10000001, &x10000001, &x10000001, &x11111111
Como se puede intuir por la secuencia de ceros y unos, eso crearía un recuadro hueco. Se puede conseguir los mismo con esta secuencia de números en decimal, que ocupa menos espacio pero resulta mucho menos intuitiva:
SYMBOL 240, 255, 129, 129, 129, 129, 129, 129, 255
Como alternativa intermedia, también se podría definir en hexadecimal, más facil de asimilar a la secuencia de ceros y unos (para quien tiene algo de experiencia) y que a la vez no ocupa mucho espacio:
SYMBOL 240, &ff, &81, &81, &81, &81, &81, &81, &ff
13.2 Un pequeño diseñador
Diseñar caracteres "de cabeza" no suele ser fácil. Es mejor ayudarse con una hoja cuadriculada o incluso con un programita hecho a medida. Existe alguno que lo hace, pero ya que estamos aprendiendo... crearlo nosotros es un reto más interesante.
Se podría dibujar una cuadrícula de 8x8 en pantalla, desplazarnos con las flechas y poner o quitar un punto al pulsar cierta tecla (por ejemplo, la barra espaciadora). Esto se puede hacer incluso desde modo texto.
Un programa básico que hiciera esto y que nos mostrara los valores correspondientes en binario y en decimal podría tener esta apariencia
Y el fuente de un diseñador sencillito como este podría ser "razonablemente pequeño" (como siempre, sería interesante como desafío que intentaras hacer algo parecido antes de "copia y pegar" éste... ;-D ) :
10 ' Definicion de caracteres
20 '
30 ' Valores iniciales
40 origenX = 5: origenY = 5
60 posX = 1: posY = 1
70 dim caracter(8,8)
100 arriba$ = chr$(240)
110 abajo$ = chr$(241)
120 izquierda$ = chr$(242)
130 derecha$ = chr$(243)
140 mode 1
150 gosub 1000: 'Dibujar cuadricula
160 gosub 2000: 'Esperar tecla
170 gosub 3000: 'Analizar tecla
180 goto 150: 'Repetir
1000 ' Dibujar cuadricula
1010 for i = 1 to 8
1020 for j = 1 to 8
1030 locate origenX + i, origenY + j
1040 if caracter(i,j) = 1 then print chr$(233) else print chr$(232)
1050 next j
1060 next i
1070 ' Y marco la posic del cursor
1080 locate origenX + posX, origenY + posY
1090 if caracter(posX,posY) = 1 then print chr$(207) else print chr$(144)
1100 ' Escribo en binario y decimal
1110 for i = 1 to 8
1120 numero$=""
1130 numeroDec=0
1140 for j = 1 to 8
1150 numero$ = numero$ + chr$(48+caracter(j,i))
1160 numeroDec = numeroDec + caracter(j,i)*2^(8-j)
1170 next j
1180 locate origenX + 10, origenY + i
1190 print numero$; " = "; numeroDec
1200 next i
1500 return
2000 ' Esperar tecla
2010 tecla$ = ""
2020 while tecla$="": tecla$=inkey$: wend
2030 return
3000 ' Analizar tecla
3010 if tecla$ = "E" then cls: end
3020 if tecla$ = arriba$ and posY > 1 then posY = posY - 1
3030 if tecla$ = abajo$ and posY < 8 then posY = posY + 1
3040 if tecla$ = izquierda$ and posX > 1 then posX = posX - 1
3050 if tecla$ = derecha$ and posX < 8 then posX = posX + 1
3060 if tecla$=" " then if caracter(posX,posY)=1 then caracter(posX,posY)=0 else caracter(posX,posY)=1
3500 return
13.3 Modificar muchas: SYMBOL AFTER
Como ya hemos comentado, en principio sólo podemos definir los caracteres del 240 al 255. Si deseamos redefinir más, bien sea porque queramos usar varios símbolos "semigráficos" en un juego, o bien porque queramos cambiar todas las letras que se van a mostrar en un programa de texto... esto se queda corto.
Pero, como suele ocurrir, esto tiene solución. Con la orden SYMBOL AFTER podemos indicar a partir de qué carácter queremos redefinir:
SYMBOL AFTER 32
La orden anterior permite que podamos modificar desde el espacio en adelante, es decir, todos los caracteres "normalmente visibles".
¿Y por qué no podemos redefinir todos desde un primer momento? Para tener más memoria libre: en un CPC6128 tenemos 42.249 bytes libres nada más arrancar (como vimos en el tema 11); si usamos SYMBOL AFTER 32, pasamos a tener sólo 40.571 bytes disponibles. Por el contrario, si queremos tener la mayor cantidad de memoria libre posible, podemos utilizar SYMBOL ATER 256, que no permite redefinir ningún carácter, a cambio de dejarnos 42.363 bytes.
13.4 Posibles problemas
No siempre funcionará la orden SYMBOL AFTER. Como hemos visto, su uso altera la cantidad de memoria libre que nos queda para programas. Pero también ocurre lo contrario: ciertas ordenes, que alteran la cantidad de memoria disponible, harán que ya no podamos utilizar SYMBOL AFTER. Es el caso de MEMORY (que también vimos en el tema 11), pero también de las órdenes de lectura y escritura de datos en disco (OPENIN y OPENOUT, vistas en el tema 10).
13.5 Ejercicio propuesto
Redefinir las letras por defecto del CPC, para crear un tipo de letra "más delgado", en el que las letras tengan sólo un pixel de grosor.
13.6 Usar una hoja de cálculo para redefinir caracteres
Si usamos un ordenador "actual" como entorno de desarrollo, tenemos otra alternativa: emplear una hoja de cálculo para definir caracteres. Esto nos puede permitir también definir varios caracteres a la vez. Por ejemplo, la siguiente imagen muestra cómo se podría definir una figura de 16x16 píxeles (2 caracteres de ancho y 2 de alto) con la ayuda de la hoja de cálculo gratuita OpenOffice Calc:
Si quieres tener el trabajo hecho, en vez de crear tú una hoja de cálculo como esa, aquí la tienes, lista para descargar.
Esa hoja de cálculo se puede mejorar un poco más: podemos usar formatos condicional para que los ceros se vean en gris, y así destaque más la forma de la figura que hemos definido. También podemos emplear la función "concatenar", para que nos escriba cómo sería cada una de las órdenes SYMBOL. Puedes descargar la versión mejorada, que tiene esta apariencia: