En nuestra última lección vimos cómo trabajar con la puntuación del jugador (SCORE), BONUS y cómo mostrarlo en pantalla con DISPLAY, y también cómo usar AT y PRINT para mostrar texto e información adicional.
Pero visualmente resulta un poco soso.
Por suerte, MPAGD tiene un editor de fuentes y varios bancos de fuentes entre los que elegir. Así que vamos a echar un vistazo: en el Editor Menu, selecciona Font:

Esta pantalla tiene tres partes.
Arriba a la izquierda tenemos un editor de caracteres. Funciona un poco como el editor de bloques: es una cuadrícula de 8x8 y podemos hacer clic en las celdas para editar el carácter. Ten en cuenta que este editor no tiene selector de color: el color de los caracteres de la fuente se gestiona de otra forma, que veremos más adelante.
Arriba a la derecha tenemos el banco de fuentes actual. Si hacemos clic en cualquiera de los caracteres del banco, aparecerá en el editor de caracteres... y podremos editarlo.
Abajo hay 12 conjuntos de fuentes ya diseñadas. Si haces clic en una, pasará a ser la fuente que usará nuestro juego.
Así que tenemos una opción: podemos usar la fuente por defecto, editarla y crear la nuestra, o instalar una de las ya hechas.
Personalmente, suelo crear mis propias fuentes para mis juegos, pero me gusta bastante la tercera de la columna central de las ya hechas, así que voy a usarla como punto de partida. Solo tengo que hacer clic para instalarla... Me saldrá un mensaje de aviso preguntando si quiero sobrescribir la fuente existente, ¡sí, por favor!:

Vamos a compilar el juego otra vez:

Lo primero que vemos es el INTRO MENU y, sí, ya usa la fuente que hemos instalado. Pero el texto negro sobre gris es un poco aburrido. Así que vamos a cambiarlo: en el menú Events selecciona Intro Menu. Todavía no voy a explicar exactamente cómo funciona, volveremos a ello más adelante, pero por ahora vamos a cambiar los colores añadiendo tres líneas de código al principio:
EVENT INTROMENU
BORDER 0
PAPER 0
INK 5
LET CONTROL = 99
WHILE CONTROL >= 99
CLS
AT 8 10
PRINT "1. KEYBOARD"
AT 10 10
PRINT "2. KEMPSTON"
AT 12 10
PRINT "3. SINCLAIR"
AT 14 10
PRINT "4. REDEFINE"
LET CONTROL = 99
WHILE CONTROL = 99
IF KEY OPTION1
LET CONTROL = 0
ENDIF
IF KEY OPTION2
LET CONTROL = 1
ENDIF
IF KEY OPTION3
LET CONTROL = 2
ENDIF
IF KEY OPTION4
CLS
AT 3 9
PRINT "PRESS KEY FOR:"
AT 6 12
WHILE KEY OPTION4
ENDWHILE
PRINT "PAUSE"
DEFINEKEY FIRE3
LET CONTROL = 100
ENDIF
ENDWHILE
ENDWHILE
CLS
Ejecuta el juego y veamos el cambio:

Ahora tenemos un borde negro, una pantalla negra y texto cian oscuro. Lo hemos definido incluyendo un número después de cada comando, pero ¿cómo sabemos qué número corresponde a cada color?
En el menú Editor selecciona Palette:
Esto mostrará los colores disponibles (estoy usando un ZX Spectrum estándar, así que esto es lo que veré: (¡he dibujado los números fatal!)

La fila de arriba muestra los colores apagados, del 0 al 7
Después, en la segunda fila, tenemos las versiones brillantes.
Entonces, ¿por qué no podemos añadir simplemente un número para el INK BRIGHT CYAN en nuestro comando INK?
Pues el problema es que el Spectrum solo tiene realmente 8 colores, pero también tiene un atributo BRIGHT, y solo puede mostrar BRIGHT INK sobre BRIGHT PAPER
Así que si queremos tener BRIGHT CYAN sobre negro, tendremos que cambiar la Colour Look Up Table a la BRIGHT. Lo hacemos añadiendo el comando CLUT
CLUT, en el Spectrum, tiene 4 valores posibles:
CLUT 0 ; los colores normales por defecto
CLUT 1 ; colores brillantes
CLUT 2 ; colores normales parpadeantes
CLUT 3 ; colores brillantes parpadeantes
Cambiemos a CLUT 1 editando el principio de nuestro evento Intro Menu:
BORDER 0 CLUT 1 PAPER 0 INK 5
Ejecuta el juego y ahora tenemos el texto brillante.

Pero eso nos ha llevado tres líneas de código para establecer los 'atributos de pantalla permanentes', y MPAGD nos ofrece un atajo para hacer las tres cosas de una vez: el comando COLOUR.
COLOUR acepta un único valor de 8 bits (0-255) para establecer de golpe la tinta, el papel, el brillo activado o desactivado y el parpadeo activado o desactivado. Aquí tienes un ejemplo de los valores disponibles:
(¡ten en cuenta que los valores a partir del 123 son las versiones parpadeantes!)

Así que, según la tabla de arriba, veo que el valor 69 es tinta cian brillante sobre papel negro, sin parpadeo.
Así que puedo cambiar el código del principio de mi evento Intro Menu por:
BORDER 0 COLOUR 69
Ejecuta el juego y debería verse exactamente igual.
Personalmente, suelo usar COLOUR cuando quiero cambiar los colores de cualquier texto de mi juego.
Ten en cuenta que todavía tengo que establecer el color del BORDER por separado, COLOUR no cambia el borde, pero no pasa nada, lo incluiré en el evento Intro menu.
Los colores que elijas se mantendrán hasta que tu código le diga al juego que haga otra cosa. Así que ahora nuestra barra de puntuación de la parte superior de la pantalla también tiene texto cian sobre negro.
Por supuesto, podemos cambiarlo añadiendo con cuidado comandos COLOUR (o PAPER & INK) donde los necesitemos. Vamos a añadir algunos a nuestro evento RESTART SCREEN, que es el que dibuja primero nuestra barra de puntuación:
EVENT RESTARTSCREEN RESTORE READ B ; read the first value of the DATA and put it in B IF SCREEN >= 1 ; if it is screen 1 or above REPEAT SCREEN ; then repeat SCREEN-many times READ B ; read the next value ENDREPEAT ; so we've found the right B value for the Screen ENDIF AT 0 0 COLOUR 4 ; dull green text on black PRINT "SCORE:" COLOUR 71 ; bright white text on black AT 0 6 SHOWSCORE AT 0 21 COLOUR 6 ; dull yellow on black PRINT "LIVES:" COLOUR 66 ; bright red on black DISPLAY DOUBLEDIGITS LIVES ;-------------------number of Bones per screen------------------------- DATA 5 7 3 4 6 9 5 8 5 6 4 8 6 9 3 8 9 DATA 4 7 8 10
Eso debería animar un poco el juego... vamos a probarlo:
Vale, empieza como esperábamos, pero en cuanto recojo un hueso, el valor de la puntuación se pone rojo.
Esto se debe a que el último comando COLOUR que hemos usado es COLOUR 66 (rojo sobre negro), y también tenemos un comando SHOWSCORE en nuestro evento COLLECT BLOCK, así que tendremos que actualizarlo con el color que prefiramos para mostrar la puntuación, es decir, COLOUR 71 ; blanco brillante sobre negro:
EVENT COLLECTBLOCK SCORE 100 ; score 100 points when we collect a Bone AT 0 6 COLOUR 71 ; bright white on black SHOWSCORE ; display the score ;...
y, como también actualizamos las LIVES cuando matan al jugador, tendremos que añadir también el COLOUR correcto allí, para que el número de vidas sea siempre rojo brillante sobre negro. Así que vamos a editar el evento KILL PLAYER:
EVENT KILLPLAYER SUBTRACT 1 FROM LIVES ; reduce the number of lives by one COLOUR 66 ; bright red on black AT 0 27 ; line 0 column 27 DISPLAY DOUBLEDIGITS LIVES ; display lives in xx format ZEROBONUS ; remove any accrued fart bonus
...compila y ejecuta el juego...
Bueno, todo parece funcionar bien...
Aunque la pantalla de Intro Menu es un poco aburrida. Al menos podríamos añadirle el título de nuestro juego, y de eso nos ocuparemos a continuación.
SIGUIENTE: PARTE 22: Trabajar con texto, MESSAGEs, CHaRacters y PRINTMODE
