Sprites con caracteres en BASIC de Amstrad CPC (III)

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

Detalle del juego West DuelEn los anteriores artículos [1] y [2] de esta serie hemos aprendido a utilizar caracteres como sprites en BASIC y a definir los nuestros propios. Sólo nos queda un último paso para introducirlos en nuestros juegos sacando toda la potencia al BASIC.

En este último artículo de esta serie aprenderemos cómo aprovecharnos de la potencia de las cadenas de caracteres en BASIC para simplificar y acelerar el dibujado de nuestros sprites. También aprenderemos a utilizar los caracteres especiales de control del cursor y cambio de color.

Cadenas de caracteres en BASIC

Las cadenas de caracteres son una de las herramientas más potentes de que dispone el BASIC. Una cadena no es más que una ristra de caracteres uno detrás de otro. Por ejemplo, en lugar de manejar los caracteres V, I, D, A, S por separado, en BASIC se puede definir la cadena “VIDAS” y manejarla entera como si fuera una sola cosa. Esto se hace así:

10 cad$="VIDAS": ' Crea la cadena "VIDAS" y la almacena en la variable cad$
20 PRINT cad$:   ' Imprime en pantalla la cadena cad$

En BASIC, las variables que almacenan cadenas deben llevar el simbolo $ al final. El mecanismo de manejo de cadenas en BASIC es bastante eficiente, sobre todo a la hora de pintarlas con PRINT. Esto podemos aprovecharlo para pintar nuestros spritesmás rápido: sólo tenemos que poner los caracteres de nuestros sprites dentro de una cadena. El siguiente ejemplo lo hace:

10 ' Crear 2 barras, usando cadenas con 3 caracteres seguidos cada una
20 barra1$=CHR$(151)+CHR$(154)+CHR$(157)
30 barra2$=CHR$(150)+CHR$(154)+CHR$(156)
40 ' Imprimir las 2 barras en la fila 4 de pantalla 
50 LOCATE 3,4:PRINT barra1$
60 LOCATE 8,4:PRINT barra2$

En las líneas 20 y 30 construimos 2 cadenas con 3 caracteres cada una. Ponemos los 3 caracteres uno a uno utilizando CHR$ y el símbolo + para unirlas. Teniendo las cadenas preparadas, imprimilas en pantalla es tan fácil como posicionar el cursor y hacer PRINT, como en las líneas 50 y 60. En ocasiones, el símbolo + no es necesario y sobra con poner los CHR$ seguidos uno detrás de otro.

Caracteres especiales en cadenas

Todavía nos falta algo: podemos crear cadenas con nuestros caracteres o sprites e imprimirlas, pero ¿Y si queremos que cada carácter sea de un color? ¿Podemos hacer que todos los caracteres salgan en la misma posición, en vez de seguidos? Sí y sí. Podemos hacer ambas cosas utilizando el mismo mecanismo del ejemplo anterior. Los caracteres del 0 al 31 son especiales: en vez de imprimirse cuando les hacemos PRINT, hacen distinas funciones como cambiar el color, mover el cursor o cambiar de modo. Esto último ya lo hemos utilizado en el artículo anterior, para activar el modo transparente, con el carácter 22. En el siguiente ejemplo usamos el caracter 15, que hace la misma función que el comando PEN, para tener un carácter de cada color dentro de una cadena:

10 ' Crear 2 barras, usando el caracter 15 para cambiar de color y STRING$ para repetir un caracter
20 barra1$=CHR$(15)+CHR$(1)+CHR$(151)+CHR$(15)+CHR$(2)+STRING$(5,154)+CHR$(15)+CHR$(1)+CHR$(157)
30 barra2$=CHR$(15)+CHR$(3)+CHR$(150)+CHR$(15)+CHR$(1)+STRING$(7,154)+CHR$(15)+CHR$(3)+CHR$(156)
40 ' Crear una cadena que sirva para activar el modo transparente
50 activaTrans$=CHR$(22)+CHR$(1)
60 ' Imprimir las 2 barras en las fila 4 y 5 de pantalla 
70 LOCATE 5,4:PRINT barra1$
80 LOCATE 3,5:PRINT barra2$
90 ' Pintar las dos barras una encima de la otra en modo transparente
100 LOCATE 3,7:PRINT barra2$
110 LOCATE 5,7:PRINT activaTrans$;barra1$

En las líneas 20 y 30 usamos secuencias de caracteres como CHR$(15)+CHR$(1) para realizar el comando PEN 1 justo antes de imprimir un carácter o una serie. Así podemos tener dibujos enteros con distintos caracteres y colores listos para imprimir con un sencillo PRINT, como en las lineas 70 y 80. También usamos esta técnica en las lineas 50 y 110 para tener en una cadena el código de activación del modo transparente, haciéndolo más cómodo y rápido de usar.

Cuando hacemos PRINT de una cadena, se van escribiendo uno a uno los caracteres en orden y se va moviendo el cursor a la derecha para que salgan seguidos. Si queremos dibujar varios caracteres en la misma posición, tenemos que volver a mover el cursor a la izquierda después de cada carácter. Esto lo hace el carácter especial 8: mueve el cursor una posición a la izquierda. En el siguiente ejemplo aprovechamos todos los caracteres que hemos visto para dibujar un sencillo vehículo:

10 ' Definimos los caracteres del dibujo del vehículo usando SYMBOL
20 SYMBOL 240, &00, &00, &81, &81, &00, &81, &81, &00: ' Ruedas
30 SYMBOL 241, &18, &3C, &42, &7E, &7E, &66, &42, &7E: ' Chasis
40 SYMBOL 242, &00, &00, &3C, &00, &00, &18, &3C, &00: ' Cristales
50 ' Creamos cadenas con secuencias de cambio de color y otras utilidades
60 amarillo$=CHR$(15)+CHR$(1)
70 azul$=CHR$(15)+CHR$(2)
80 rojo$=CHR$(15)+CHR$(3)
90 izq$=CHR$(8): ' Mover el cursor a la izquierda
100 trans$=CHR$(22)+CHR$(1): ' Activar transparencia
110 ' Creamos una cadena que defina el sprite del vehiculo
120 coche$=azul$+CHR$(240)+rojo$+izq$+CHR$(241)+amarillo$+izq$+CHR$(242)
130 ' Imprimir el sprite del coche en pantalla
140 MODE 0:LOCATE 7,3:PRINT trans$;coche$

En las lineas 60 a 100 creamos 4 cadenas con caracteres especiales para cambiar de color, mover el cursor a la izquierda y activar el modo transparente. Con estas cadenas ya creadas, introducir estos caracteres en la cadena que define el coche$ (linea 120) es más fácil y claro. Así, poner rojo$ es lo mismo que poner CHR$(15)+CHR$(3), sólo que más corto, rápido y legible. Lo mejor de esta forma de organizarse es que se pueden crear nuevos sprites componiendo cadenas con otros sprites ya creados previamente.

Ejemplo de código en un juego

Con las cadenas y los caracteres especiales podemos construir usos bastante elaborados que nos permitan, por ejemplo, manejar sprites de varios caracteres de tamaño más fácilmente. Un ejemplo lo encontramos en el código del juego de ejemplo WEST DUEL:

16030 cPen$=CHR$(15):          ' Caracter especial de la orden PEN
16040 cAmarillo$=cPen$+CHR$(1) 
16050 cVerde$=cPen$+CHR$(8)
16060 cRojo$=cPen$+CHR$(3)
16070 cNegro$=cPen$+CHR$(5)
16080 cAzulClaro$=cPen$+CHR$(2)
16090 izq$=CHR$(8):            ' Mueve cursor a la izquierda
16100 dcha$=CHR$(9):           ' Mueve cursor a la derecha
16110 abj$=CHR$(10):           ' Mueve cursor abajo
[...]
18000 '----------------------------------------------------------
18010 ' SPRITES DE LOS JUGADORES 
18020 '----------------------------------------------------------
18030 j1QuietoSP$=cNegro$+CHR$(220)+izq$+cRojo$+CHR$(221)+abj$+izq$+cNegro$+CHR$(222)+izq$+cRojo$+CHR$(223)
18040 j2QuietoSP$=cNegro$+CHR$(224)+izq$+cRojo$+CHR$(225)+abj$+izq$+cNegro$+CHR$(226)+izq$+cRojo$+CHR$(227)
18050 j1PreparadoSP$=cNegro$+CHR$(228)+izq$+cRojo$+CHR$(229)+abj$+izq$+cNegro$+CHR$(230)+izq$+cRojo$+CHR$(231)
18060 j2PreparadoSP$=cNegro$+CHR$(232)+izq$+cRojo$+CHR$(233)+abj$+izq$+cNegro$+CHR$(234)+izq$+cRojo$+CHR$(235)
18070 j1DisparaSP$=cNegro$+CHR$(236)+izq$+cRojo$+CHR$(237)+abj$+izq$+cNegro$+CHR$(239)+izq$+cRojo$+CHR$(240)
18080 j2DisparaSP$=cNegro$+CHR$(241)+izq$+cRojo$+CHR$(242)+abj$+izq$+cNegro$+CHR$(243)+izq$+cRojo$+CHR$(244)
18090 j1CaidoSP$=abj$+izq$+cNegro$+CHR$(245)+izq$+cRojo$+CHR$(246)+cNegro$+CHR$(247)+izq$+cRojo$+CHR$(248)
18100 j2CaidoSP$=abj$+cNegro$+CHR$(249)+izq$+cRojo$+CHR$(250)+cNegro$+CHR$(251)+izq$+cRojo$+CHR$(252)
18110 j1BorrarSP$=cAzulClaro$+CHR$(143)+abj$+izq$+CHR$(143)
18120 j2BorrarSP$=j1BorrarSP$
[...]

En este extracto del código del WEST DUEL, vemos como se crean cadenas de utilidad en las lineas 16030 a 16110 con caracteres especiales. Además de los ya explicados caracteres 15 y 8 para PEN y mover cursor a la izquierda, también se usan los caracteres 9 y 10 que mueven el cursor a la derecha y abajo. En las lineas 18030 a 18120 vemos como se crean sprites de los jugadores 1 y 2 en distintas posiciones (quieto, preparado, dispara y caido), además de un sprite pensado para borrar al personaje. Los sprites que se crean en estas líneas tienen un tamaño de 2×1 caracteres (1×2 cuando están en el suelo). Después de lo explicado en este artículo, se entiende cómo funciona el mecanismo para definir estos sprites y poder usar luego un simple PRINT para imprimir cualquiera de ellos.

Recursos y enlaces

Manuales del Amstrad CPC

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

Deja un comentario