Manual de Basic Spectrum 48k.

Capítulo 16

Colores

Resumen

  • INK, PAPER, FLASH, BRIGHT, INVERSE, OVER
  • BORDER

Ejecute este programa:

  10 FOR m = 0 TO 1: BRIGHT m
  20 FOR n = 1 TO 10
  30 FOR c = 0 TO 7
  40 PAPER c: PRINT "    " ;: REM 4 espacios coloreados
  50 NEXT c: NEXT n: NEXT m
  60 FOR m = 0 TO 1: BRIGHT m: PAPER 7
  70 FOR c = 0 TO 3
  80 INK c: PRINT c;"    ";
  90 NEXT c: PAPER 0 100 FOR c = 4 TO 7
110 INK c: PRINT c;"    ";
120 NEXT c: NEXT m
130 PAPER 7: INK 0: BRIGHT 0

Muestra los ocho colores (incluyendo blanco y negro) y los dos niveles de brillo que el ZX Spectrum puede producir en un televisor en color (si su televisión es de blanco y negro, verá diversas tonalidades de grises). Damos a continuación una lista de colores para referencia; se escriben también con las teclas de números adecuadas.

  1. - negro
  2. - azul
  3. - rojo
  4. - púrpura o magenta
  5. - verde
  6. - azul claro, técnicamente llamado "cyan"
  7. - amarillo
  8. - blanco

En una televisión de blanco y negro, estos números están en orden de brillo o luminosidad.

Para utilizar adecuadamente estos colores, necesita conocer un poco sobre cómo se dispone la imagen.

La imagen está dividida en 768 (24 líneas de 32) posiciones en donde pueden imprimirse caracteres y cada carácter se imprime como un cuadrado de 8x8 puntos como para a. Esto debe recordarlo de cuando se trató de los gráficos definidos por el usuario en el capítulo 16, en donde teníamos "ceros" para los puntos blancos y "unos" para los puntos negros.

La posición de carácter se ha asociado también con dos colores: la tinta, o color de primer plano, que es el color para los puntos negros en nuestro cuadrado y el papel, o color de fondo, que se utiliza para los puntos blancos. Para comenzar, cada posición tiene tinta negra y papel blanco, por lo que la escritura aparece como negro sobre blanco.

La posición de carácter tiene también un brillo (brillo normal o especial) y una característica de parpadeo o sin parpadeo (este parpadeo se consigue basculando los colores de tinta y de papel). Todo ello se puede codificar en números, de modo que una posición de carácter tiene:

  1. un cuadrado de 8x8 de "ceros" y de "unos" para definir la forma del carácter, con "0" para papel y "1" para tinta,
  2. colores de tinta y de papel, cada uno codificado en un número entre 0 y 7,
  3. un brillo -0 para brillo normal, 1 para brillo especial y
  4. un número parpadeante -0 para fijo, 1 para parpadeo.

Tenga presente que puesto que los colores de tinta y de papel cubren una posición de carácter completa, posiblemente no pueda tener más de dos colores en un bloque dado de 64 puntos. Lo mismo es válido para el número de parpadeo y brillo; se refieren a la posición de carácter completa y no a puntos individuales. Los colores, brillo y número de parpadeo en una posición dada se denominan atributos.

Cuando imprime algo en la pantalla, cambia la configuración de puntos en esa posicion; es menos obvio, pero no obstante cierto, que cambia también los atributos en esa posición. Al comenzar no lo observará porque todo se imprime con tinta negra sobre papel blanco (y brillo normal y sin parpadeo), pero puede variarlo con las sentencias INK, PAPER, BRIGHT y FLASH. Pruebe

PAPER 5

y luego, imprima algunas cosas. Todo aparecerá sobre papel "cyan" (azul-verdoso pálido), porque a medida que se imprimen, los colores del papel, en las posiciones que ocupan, se ponen a "cyan" (que tiene código 5).

Las demás operan de la misma forma, por lo que después de

PAPER número entre 0 y 7
INK número entre 0 y 7
BRIGHT 0 ó 1
o
FLASH 0 ó 1
considere 0 como desactivado y 1 como activado

cualquier impresión establecerá el atributo correspondiente en todas las posiciones de carácter que utilice. Pruébelo con algunos ejemplos. Ahora debe ser capaz de ver cómo operaba el programa al principio (recuerde que un espacio es un carácter que tiene el mismo color de tinta (INK) y de papel (PAPER)).

Hay algunos números más que puede utilizar en estas sentencias que tienen efectos menos directos.

El número 8 puede utilizarse en las cuatro sentencias y significa "transparente" en el sentido de que el anterior atributo se transparenta. Supongamos, por ejemplo, que introduce

PAPER 8

entonces, ninguna posición de carácter tendrá su color de papel puesto a 8, porque no existe ningún color correspondiente; lo que sucede es que cuando se imprime una posición, su color de papel se deja el mismo que había antes. INK 8, BRIGHT 8 y FLASH 8 operan de la misma forma para los demás atributos.

El número 9 sólo puede utilizarse con PAPER e INK y significa "contraste". El color (tinta o papel) que utiliza con uno de ellos ha de estar en contraste con el del otro, de modo que sea blanco si el otro es oscuro (negro, azul, rojo o magenta) y negro si el otro es claro (verde, cyan, amarilo o blanco). Pruebe lo anterior tecleando:

INK 9: FOR c = 0 TO 7: PAPER c: PRINT c: NEXT c

Una visualización más destacada de su potencia ha de ejecutar el programa al principio para obtener bandas coloreadas y luego introduciendo:

INK 9: PAPER 8: PRINT AT 0,0;: FOR n = 1 TO 1000: PRINT n;: NEXT n

En este caso, el color de la tinta siempre estará en contraste con el color del papel anterior en cada posición.

La televisión en color se basa en el hecho bastante curioso de que el ojo humano sólo puede ver realmente tres colores, que son los primarios: azul, rojo y verde. Los demás colores son mezclas de ellos. Por ejemplo, el magenta se consigue mezclando azul con rojo (que es la razón de que su código 3 sea la suma de los códigos correspondientes a los colores azul y rojo).

Para ver cómo los ocho colores se acoplan juntos, imagine tres proyectores rectangulares, con colores azul, rojo y verde, que inciden en un lugar no coincidente en un recinto de papel blanco en la oscuridad. En donde se solapen verá mezclas de colores, como se indica por el siguiente programa (observe que los espacios de tinta se obtienen con el empleo de una u otra tecla SHIFT con 8, cuando se está en el modo G).

    10 BORDER 0: PAPER 0: INK 7: CLS
    20 FOR a = 1 TO 6
    30 PRINT TAB 6; INK 2;"" : REM 18 cuadrados de tinta
    40 NEXT a
    50 LET dataline = 200
    60 GO SUB 1000
    70 LET dataline = 210
    80 GOSUB 1000
    90 STOP
  200 DATA 2,3,7,5,4
  210 DATA 2,2,6,4,4
1000 FOR a = 1 TO 6
1010 RESTORE dataline
1020 FOR b = 1 TO 5
1030 READ c: PRINT INK c;"";: REM 6 cuadrados de tinta
1040 NEXT b: PRINT : NEXT a
1050 RETURN

Hay una función denominada ATTR que averigua cuáles son los atributos que están en una posición dada en la pantalla. Se trata de una función bastante complicada, por lo que se ha relegado al final de este capítulo.

Hay otras dos sentencias, INVERSE Y OVER, que no controlan los atributos, sino las configuraciones de puntos que se imprimen en la pantalla. Utilizan los números 0 para desactivación y 1 para activación, en la misma forma que para el parpadeo (FLASH) o para el brillo (BRIGHT), pero ellas no son las únicas posibilidades. Si hace INVERSE 1, entonces, las configuraciones de puntos impresas serán las inversas de su forma habitual: los puntos de papel serán sustituidos por puntos de tinta y viceversa. Así, a se imprimiría como

Si (como en la condición de encendido) tenemos tinta negra y papel blanco, entonces, esta a aparecerá como blanco sobre negro (pero seguimos teniendo tinta negra y papel blanco en esa posición de carácter). Son los puntos los que han cambiado.

La sentencia

OVER 1

pone en acción una clase especial de sobreimpresión. En condiciones normales, cuando algo se escribe en una posición de carácter, borra completamente lo que había antes en la misma; pero, ahora, el carácter nuevo simplemente se añadirá en la parte superior del anterior (véase Ejercicio 3). Ello puede ser especialmente útil para escribir caracteres compuestos, como letras con acentos, como es el caso del siguiente programa para imprimir letras alemanas góticas (una "o" con una diéresis sobre ella. (Haga NEW primero).

10 OVER 1
20 FOR n = 1 TO 32
30 PRINT "o"; CHR$ 8; """";
40 NEXT n

(observe el carácter de control CHR$ 8 que hace retroceder un espacio).

Hay otra forma de utilizar INK, PAPER, etc., que probablemente encontrará de más utilidad que como sentencias. Puede ponerles como elementos de información en una sentencia PRINT (seguidos por ;) y, entonces, hacen exactamente lo mismo que si se hubieran empleado como sentencias, con la salvedad de que su efecto sólo es temporal: duran hasta el final de la sentencia PRINT que las contiene. Así, si teclea.

PRINT PAPER 6; "x";: PRINT "y"

entonces, solamente la x estará en amarillo.

INK y el resto, cuando se utilizan como sentencias, no afectan a los colores de la parte inferior de la pantalla, en donde se introducen los comandos y los datos de INPUT. La parte más baja de la pantalla utiliza el color del contorno para su color de papel y el código 9 de contraste para su color de tinta, tiene desactivado el parpadeo y todo con brillo normal. Puede cambiar el color del contorno a cualquiera de los ocho colores normales (excepto 8 ó 9) con el empleo de la sentencia

BORDER color

Cuando hace una entrada de datos, se sigue esta norma de empleo de tinta de contraste en papel coloreado en el contorno; pero puede cambiar el color de los epígrafes escritos por el ordenador utilizando los elementos de INK y PAPER (y así sucesivamente) en la sentencia INPUT, lo mismo que lo haría en una sentencia PRINT. Su efecto dura bien hasta el final de la sentencia o bien hasta que se tecleen algunos datos en INPUT, lo que suceda primero. Pruebe:

INPUT FLASH 1; INK 1; "Cuál es su número?"; n

Hay otra forma de cambiar los colores con el empleo de caracteres de control (de manera bastante similar a la utilizada con los caracteres de control para AT y TAB en el capitulo 15.

CHR$ 16 corresponde a INK
CHR$ 17 corresponde a PAPER
CHR$ 18 corresponde a FLASH
CHR$ 19 corresponde a BRIGHT
CHR$ 20 corresponde a INVERSE
CHR$ 21 corresponde a OVER

Cada uno de ellos va seguido por un carácter que indica un color mediante su código; así, por ejemplo:

PRINT CHR$ 16 + CHR$9; ...

tiene el mismo efecto que:

PRINT INK 9; ...

De todos modos, no se habría molestado en utilizar estos caracteres de control porque habría preferido emplear los elementos de color. Sin embargo, algo de gran utilidad que puede hacer con ellos es ponerles en programas, de modo que las partes diferentes que se incluyen sean objeto de listado en colores distintos, para separarlos entre sí o incluso para darles un aspecto más atractivo. Debe ponerlos después del número de línea o se perderán.

Para incluirlos en el programa, ha de introducirlos por el teclado, principalmente utilizando el modo extendido con los dígitos.

Los dígitos 0 a 7 establecen el color correspondiente (de tinta si se pulsa también CAPS SHIFT, de papel si no se pulsa).

Más precisamente, si está en el modo E y pulsa un dígito (por ejemplo, 6 para amarillo; de cualquier modo, ha de estar entre 0 y 7, nunca 8 ó 9), entonces, se insertan dos caracteres: primero, CHR$ 17 para papel y luego, CHR$ 6 que significa "ponerlo en amarillo". Si hubiera estado pulsando CAPS SHIFT cuando pulsó el dígito, hubiera conseguido CHR$ 16 que significa "poner color de tinta" en lugar de CHR$ 17.

Puesto que estos son dos caracteres con los que puede obtener algunos efectos singulares cuando los borre, debe pulsar DELETE dos veces. Después de la primera pulsación conseguirá, con frecuencia, un signo de interrogación o aparecerán cosas todavía más singulares. No se preocupe, le bastará con pulsar DELETE otra vez.

y pueden comportarse también extrañamente mientras el cursor se esté desplazando más allá de los caracteres de control.

Todavía en el modo extendido:

8 da CHR$ 19 y CHR$ 0 para brillo normal
9 da CHR$ 12 y CHR$ 1 para brillo especial
CAPS SHIFT con 8 da CHR$ 18 y CHR$ 0 para no parpadeo
CAPS SHIFT con 9 da CHR$ 19 y CHR$ 1 para parpadeo

Hay un par más en el modo ordinario (L):

CAPS SHIFT con 3 da CHR$ 20 y CHR$ 0 para caracteres normales
CAPS SHIFT con 4 da CHR$ 20 y CHR$ 1 para caracteres inversos

Para resumir, damos a continuación una descripción completa de la fila superior en el teclado:

La función ATTR tiene la forma

ATTR (línea, columna)

Sus dos argumentos son los números de línea y de columna que utilizaría en un elemento AT y su resultado es un número que indica los colores y así sucesivamente en la posición de carácter correspondiente en la pantalla de televisión. Puede utilizarlo tan libremente en expresiones como pueda hacerlo con cualquier otra función.

El número resultante es la suma de otros cuatro números como sigue:

128 si la posición de carácter está parpadeando, 0 si no parpadea

64 si la posición de carácter es brillante, 0 si es normal

8 * código para el color del papel

número correspondiente al color de la tinta.

Por ejemplo, si la posición de carácter está parpadeando y tiene brillo normal con papel amarillo y tinta azul, entonces, los cuatro números que hemos de sumar son 128, 0, 8 * 6 ( = 48) y 1, lo que hace un total de 177. Pruebe lo anterior con:

PRINT AT 0,0; FLASH 1; PAPER 6; INK 1; " "; ATTR (0,0)

Ejercicios

  1. Pruebe

    PRINT "B"; CHR$ 8; OVER 1; "/"

    en donde la barra / atraviesa la B y ha dejado un punto blanco. Esta es la forma en que la sobreimpresión actúa en el ZX Spectrum: dos papeles o dos tintas dan un papel, uno de cada uno da una tinta. Ello tiene la propiedad interesante de que si sobreimprime con la misma cosa dos veces volverá a lo que tenía al principio. Si, ahora teclea:

    PRINT CHR$ 8; OVER 1; "/"

    ¿por qué recupera una B impoluta sin barra?

  2. Teclee:

    PAPER 0: INK 0

    ¿no es lo mismo que estas no afecten a la parte inferior de la pantalla?

    Ahora, teclee:

    BORDER 0

    y vea lo bien que le trata el ordenador (!)

  3. Ejecute este programa

    10 POKE 22527 + RND * 704, RND * 127
    20 GO TO 10

    No importa cómo opera; está cambiando los colores de los cuadrados en la pantalla de televisión y las RND deben conseguir que ello suceda aleatoriamente. Las bandas diagonales que quizás vea son una manifestación de la configuración oculta en RND (la configuración que le hace pseudoaleatoria en lugar de realmente aleatoria.

  4. Teclee, o haga la función de carga LOAD de los caracteres de piezas de ajedrez del capítulo 14 y luego introduzca por el teclado el siguiente programa que dibuja un diagrama de una posición de ajedrez que las emplea.

        5 REM dibujo del tablero sin fichas
      10 LET bb = 1: LET bw = 2: REM rojo y azul para tablero
      15 PAPER bw: INK bb: CLS
      20 PLOT 79, 128: REM contorno
      30 DRAW 65, 0: DRAW 0, -65
      40 DRAW -65, 0: DRAW 0, 65
      50 PAPER bb
      60 REM tablero
      70 FOR n = 0 TO 3: FOR m = 0 TO 3
      80 PRINT AT 6 + 2 * n, 11 + 2 * m; " "
      90 PRINT AT 7 + 2 * n, 10 + 2 * m; " "
    100 NEXT m: NEXT n
    110 PAPER 8
    120 LET pw = 6: LET pb = 5: REM colores de piezas blancas y negras
    200 DIM b$(8, 8): REM posiciones de piezas
    205 REM preparación de las posiciones iniciales
    210 LET b$(1)= "rnbqkbnr"
    220 LET b$(2) = "pppppppp"
    230 LET b$(7) = "PPPPPPPP"
    240 LET b$(8)= "RNBQKBNR"
    300 REM visualización del tablero
    310 FOR n = 1 TO 8: FOR m = 1 TO 8
    320 LET bc = CODE b$(n, m); INK pw
    325 IF bc = CODE " " THEN GO TO 350: REM espacio
    330 IF bc > CODE "Z" THEN INK pb: LET bc = bc - 32: REM minúsculas para negro
    340 LET bc = bc + 79: REM conversión a gráficos
    350 PRINT AT 5 + n, 9 + m; CHR$ bc
    360 NEXT m: NEXT n
    400 PAPER 7: INK 0


Manual de Basic Spectrum 48k.