Sprites con caracteres en BASIC de Amstrad CPC (II)

Este artículo es el número 2 de 3 de la serie Sprites con caracteres para Amstrad CPC
Luchadoras
Luchadoras by Dardalorth

Ya sabemos utilizar caracteres como sprites en BASIC. Pero todavía hay muchas dudas que resolver para tener unos sprites chulos: ¿Qué caracteres hay? ¿Cuántos? ¿Podemos crear los nuestros propios? ¿Cómo lo hacemos?

En este segundo articulo de la serie tenemos ejemplos para crear nuestros propios caracteres, mezclaros con distintos colores y producir sprites más avanzados, como las luchadoras de Dardalorth. ¿Listos para empezar?

Nuestros propios caracteres

En el anterior artículo de esta serie vimos cómo imprimir caracteres para usarlos como sprites. El Amstrad CPC tiene 224 caracteres imprimibles (del 32 al 255) pero, ¿Qué aspecto tienen estos caracteres? Para esto, podemos verlos en el manual del usuario, o hacernos un programita que los dibuje todos seguidos en pantalla:

10 MODE 0:         ' Cambiar a modo 40x20
20 FOR i=32 to 255:' Repetir desde i=32 hasta i=255
30  PRINT CHR$(i);:' Imprimir caracter i, sin salto de linea
40 NEXT i:         ' Siguiente i (i+1)
50 LOCATE 1, 15:   ' Cursor a la línea 15

Usando estos caracteres para nuestros sprites vamos a estar muy limitados. Sin embargo, el Amstrad CPC nos da la posibilidad de definir algunos de estos caracteres a nuestro gusto. Esto podemos hacerlo utilizando el comando SYMBOL. Vamos a ver un ejemplo de cómo funciona SYMBOL en la práctica y después lo destriparemos para entenderlo. El siguiente programita cambia la forma carácter 240 para que se parezca un poco a un enemigo del clásico juego Space Invaders:

10 MODE 0
20 SYMBOL 240,&18,&3C,&7E,&DB,&7E,&66,&DB,&81:  ' Definir el caracter 240
30 LOCATE 10, 5
40 PRINT CHR$(240):  ' Imprimir el caracter 240 en la posicion 10, 5

El programa es muy simple salvo por el contenido del comando SYMBOL, ¿Qué significan esos números? La explicación es sencilla y puedes entenderla fácilmente mirando la figura 1. Un carácter tiene 64 píxeles: 8 de alto por 8 de ancho. SYMBOL necesita saber qué carácter queremos definir (240) y qué pixeles hay encendidos. Por eso, en la línea 20 del programa ponemos un 240 seguido de 8 números: cada número dice qué pixeles hay encendidos en esa fila.

Carácter Alien Definido en Hexadecimal
Figura 1. Definición carácter Alien

Para saber el número que define una fila, la dividimos en 2 grupos de 4 pixeles (en rojo y verde en la figura 1). Cada grupo sólo tiene 16 combinaciones diferentes, que puedes ver a la derecha en la figura. Así, buscando en la lista el grupo 1 de la fila 1, corresponde al número 1, y el el grupo 2 al número 8. Por tanto, la fila 1 se define como &18. En la fila 2, el grupo 1 corresponde al número 3, y el grupo 2 a la letra C, quedando la fila como &3C. Y así, se repite para las 8 filas, obteniendo los 8 números de la figura 1, que son los mismos que habíamos puesto en el programa.

Si quieres saber más sobre estas operaciones, lo que estamos haciendo es convertir números de binario a hexadecimal. Lo hacemos por comodidad, para que el programa quede pequeñito y legible, aunque SYMBOL admite los datos directamente en binario, si lo prefieres:

20 SYMBOL 240,&X00011000,&X00111100,&X01111110,&X11011011,&X01111110,&X01100110,&X11011011,&X10000001

Sprites multicolor: mezclando caracteres

Ojos y Boca para el Alien
Figura 2. Ojos+Boca Alien

En nuestro anterior artículo explicamos como utilizar el “modo transparente” a la hora de pintar caracteres. Este modo nos permite componer varios caracteres definidos por nosotros en un solo sprite. Vamos a utilizarlo para que nuestro Alien tenga ojos y boca:

10 MODE 0
20 ' -- Definir Alien / Ojos y Boca --
30 SYMBOL 240,&18,&3C,&7E,&DB,&7E,&66,&DB,&81
40 SYMBOL 241,&00,&00,&00,&24,&00,&18,&00,&00
50 ' -- Activar Modo Transparente --
60 PRINT CHR$(22)+CHR$(1)
70 ' -- Imprimir Alien en Amarillo y Rojo, en la posicion 10,5 --
80 LOCATE 10,5:PEN 1:PRINT CHR$(240)
90 LOCATE 10,5:PEN 3:PRINT CHR$(241)

Utilizando esta técnica podemos crear sprites mezclando varios caracteres definidos por nosotros, utilizando distintos colores. El siguiente programa crea un sprite de un personaje utilizando 9 caracteres definidos, dibujándolos en 3 líneas diferentes (cabeza, cuerpo y piernas):

10 ' Definir todos los caracteres del sprite
20 SYMBOL 240,&00,&00,&74,&7E,&6C,&70,&7C,&30: ' Cara
30 SYMBOL 241,&7E,&FD,&80,&80,&80,&80,&40,&00: ' Pelo
40 SYMBOL 242,&00,&00,&08,&00,&00,&00,&00,&00: ' Ojo
50 SYMBOL 243,&00,&00,&00,&00,&10,&0C,&00,&00: ' Boca
60 SYMBOL 244,&60,&F8,&FC,&FC,&FC,&FC,&FC,&FC: ' Cuerpo
70 SYMBOL 245,&00,&00,&60,&60,&30,&30,&00,&00: ' Brazo
80 SYMBOL 246,&00,&00,&00,&00,&0C,&0C,&00,&00: ' Mano
90 SYMBOL 247,&FC,&FC,&EC,&CC,&CC,&CC,&00,&00: ' Pantalon
100 SYMBOL 248,&00,&00,&00,&00,&00,&00,&EE,&EE: ' Zapatos
110 ' -- Cambiar a modo 0 y activar modo transparente --
120 MODE 0
130 PRINT CHR$(22)+CHR$(1)
140 ' -- Imprimir Cabeza en posicion 5,2 --
150 LOCATE 5,2:PEN 11:PRINT CHR$(240);
160 LOCATE 5,2:PEN 1:PRINT CHR$(241);
170 LOCATE 5,2:PEN 8:PRINT CHR$(242);
180 LOCATE 5,2:PEN 3:PRINT CHR$(243);
190 ' -- Imprimir Cuerpo en posicion 5,3 --
200 LOCATE 5,3:PEN 10:PRINT CHR$(244);
210 LOCATE 5,3:PEN 6:PRINT CHR$(245);
220 LOCATE 5,3:PEN 11:PRINT CHR$(246);
230 ' -- Imprimir Piernas en posicion 5,4 --
240 LOCATE 5,4:PEN 9:PRINT CHR$(247);
250 LOCATE 5,4:PEN 3:PRINT CHR$(248);
260 PRINT:   ' Saltar una linea para separar el Ready

Con este último ejemplo ya has visto que podemos crear todo tipo de sprites: el límite sólo lo pone nuestra imaginación.

SYMBOL y la memoria

Seguramente te preguntarás por qué hemos definido caracteres a partir del 240. Por defecto, el BASIC sólo nos deja definir los caracteres del 240 al 255. Esto es así porque las nuevas definiciones se tienen que guardar dentro de los 64K de memoria RAM, ocupando espacio. Los demás caracteres están guardados en ROM, dejando la RAM libre para nuestros programas o datos. Aún sabiendo esto, nosotros podemos querer definir más caracteres (para hacer más sprites, por ejemplo). Para eso tenemos el comando SYMBOL AFTER:

10 SYMBOL AFTER 200: ' Permitir definir caracteres del 200 al 255
20 ' -- Definir un simpatico careto --
30 SYMBOL 200,&66,&81,&00,&00,&00,&10,&00,&00:  ' Cejas+Nariz
40 SYMBOL 201,&00,&00,&66,&66,&00,&00,&00,&00:  ' Ojos
50 SYMBOL 202,&00,&00,&00,&00,&00,&81,&42,&3C:  ' Boca
60 ' -- Configurar la pantalla y activar modo transparente --
70 MODE 0: PRINT CHR$(22)+CHR$(1)
80 ' -- Imprimir el careto --
90 LOCATE 5,2:PEN 1:PRINT CHR$(200);
100 LOCATE 5,2:PEN 13:PRINT CHR$(201);
110 LOCATE 5,2:PEN 3:PRINT CHR$(202)
120 PRINT: ' Dejar 1 linea en blanco

Como ves, con SYMBOL AFTER podemos decidir qué caracteres van a ser definibles en nuestro programa. La recomendación principal es que no declares definibles más de los que vas a usar (para ahorrar memoria). También debes tener cuidado si quieres definir caracteres por debajo del 127, ya que esos caracteres son los que se usan para las letras y símbolos. Por ejemplo, si defines el carácter 65, cambiarás la forma de la letra A mayúscula; a partir de ese momento, verás lo que hayas definido en lugar de la letra A, y esto puede impedirte entender fácilmente lo que ponga en pantalla. Sin embargo, si te pasa esto, puedes arreglarlo escribiendo en pantalla:

SYMBOL AFTER 256

Con esta orden eliminas todos los caracteres definidos de la RAM, reseteando sus definiciones a las que hay por defecto en la ROM.

Ahora ya puedes definir y manejar caracteres para crear tus propios sprites. En el próximo, y último artículo de esta serie, veremos cómo dibujar nuestros sprites de forma más cómoda y rápida, para que nuestros juegos en basic funcionen lo más suaves posible.

Recursos y enlaces

Manuales del Amstrad CPC

Artículos en esta serie<< Sprites con caracteres en BASIC de Amstrad CPCSprites con caracteres en BASIC de Amstrad CPC (III) >>

Un comentario en “Sprites con caracteres en BASIC de Amstrad CPC (II)

Deja un comentario