Minilop Retroware

MPAGD Principiantes · Parte 21 de 29

Vamos a crear un juego con MPAGD - Parte 21: Cambiar fuentes, COLOUR, PAPER, INK y CLUT

30 de octubre de 2021

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:

Captura de pantalla del tutorial

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!:

Captura de pantalla del tutorial

Vamos a compilar el juego otra vez:

Captura de pantalla del tutorial

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:

Captura de pantalla del tutorial

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!)

Captura de pantalla del tutorial

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.

Captura de pantalla del tutorial

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!)

Captura de pantalla del tutorial

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

Todo MPAGD Principiantes