Mi proyecto actual, The Swarm is Coming..., tiene un HUD (Head Up Display) bien diseñado (o eso creo yo) que muestra el arma actual, la salud, mensajes y demás.


Cuando lo creé por primera vez, lo diseñé con bloques. Luego, en mi script de Game Initialisation, lo convertí en código usando PUTBLOCK.
Fue una idea estúpida.
Por varias razones.
Primero, supuso una larga ristra de código, un montón de bucles REPEAT, muchos PUTBLOCK y así sucesivamente.
No es muy eficiente.
Segundo, estoy desarrollando el juego con Adventure Mode, y en el modo aventura MPAGD guarda datos de cualquier PUTBLOCK que se ejecute durante el juego, de modo que una pantalla que cambia (quizá si quitas un bloque de pared y lo sustituyes por un bloque vacío para, digamos, una puerta que se ha desbloqueado) conserve los bloques nuevos si la pantalla se vuelve a dibujar o se vuelve a entrar en ella.
Ahora bien, mi HUD es interactivo, así que cuando el jugador elige un arma distinta, el icono de la bala en el HUD cambia.
¡Prueba a hacer eso en modo aventura con PUTBLOCK! El juego se quedará sin memoria enseguida.
La solución la tenía delante de las narices todo el tiempo. Una de las herramientas más potentes de MPAGD: DATA & READ.
Y, por supuesto, la posibilidad de redefinir la fuente.
Así que me puse a redefinir la fuente, sustituyendo los caracteres que el juego no va a usar por los gráficos de mi HUD.
Cada carácter de la fuente (en este caso, nuestros gráficos del HUD) se puede invocar con el comando CHR, siempre que sepamos su número.
Así es como queda ahora mi fuente:

CHR empieza en 32 (el 32 es un espacio en blanco... probablemente lo necesitarás, ¡así que mejor no redefinirlo!)
Verás que aquí tuve que hacer una concesión: solo tengo un juego de mayúsculas o minúsculas, todo en mayúsculas, pero no fue un gran sacrificio para mí.
Así que el primer CHR de la fuente es el 32, luego el 33, el 34 y así sucesivamente. Por tanto, tendremos que llevar la cuenta del número de CHR de cada gráfico del HUD.
Vale, una vez hecho esto probablemente habrás notado un problema... Las fuentes no tienen colores como el editor de BLOCK; la forma más eficiente es usar el comando COLOUR, que, igual que CHR, necesita un número de 8 bits para definir los atributos de papel, tinta, brillo y parpadeo (flash).
Aquí tienes una práctica tabla de referencia para recortar y guardar que hice...

Así que el color 1 es tinta azul oscuro sobre papel negro, y el color 93 es tinta cian brillante sobre papel magenta brillante. Ten en cuenta que los colores 123 en adelante tienen el atributo Flash... ¡que obviamente no funciona bien en una imagen estática!
Para cada línea horizontal de mi HUD ya debería tener una lista de CHR y COLOUR.
Así que vamos a meterlos en una o varias sentencias DATA
Debes introducir tus DATA en formato de pares:
DATA (COLOUR#) (CHR#) (COLOUR#) (CHR#) (COLOUR#) (CHR#) .... y así sucesivamente
Cada sentencia DATA puede tener 16 de estos números (8 pares)
Así que tu primera sentencia DATA definirá los primeros 8 caracteres (en horizontal) de tu HUD
Si tu juego usa todo el ancho de pantalla, necesitarás por tanto 4 sentencias DATA para definir por completo cada línea de tu HUD (el mío usa 6 líneas de ancho completo)
Una vez definidos por completo tus DATA, solo necesitamos un pequeño script que haga READ de los valores de CHR y COLOUR de cada celda del HUD y luego los muestre en pantalla... algo así:
; DRAW THE HUD
;==========================================================
LET B = 0 ; We'll use B for the LINE NUMBER
REPEAT 6 ; my HUD has 6 lines of graphics
AT B 0 ; so we'll start in the top left corner
REPEAT 32 ; for each line there are 32 character squares
READ V ; the first number we read is the COLOUR value, store it in V
READ W ; the second number we read is the CHR value, store it in W
COLOUR V ; set the COLOUR to V
CHR W ; display CHR W
ENDREPEAT ; do this for each cell in the row
ADD 1 TO B ; then increment B (to go to the next LINE)
ENDREPEAT ; and do it all again!
;HUD DATA - ALTERNATES BETWEEN COLOUR AND CHR
DATA 71 68 71 69 71 69 5 70 4 76 68 77 71 68 71 69
DATA 71 69 5 70 4 76 68 77 71 123 71 124 71 125 5 126
DATA 4 76 68 77 71 68 71 69 71 69 71 69 71 69 71 69
DATA 71 69 71 69 71 69 71 69 71 69 71 69 71 69 5 70
DATA 71 71 79 78 79 32 5 72 4 67 68 87 71 71 79 78
DATA 79 32 5 72 4 67 68 87 71 71 79 78 79 32 5 72
DATA 4 67 68 87 71 71 79 78 79 32 15 32 15 32 15 32
DATA 15 32 15 32 15 32 15 32 15 32 15 32 15 32 5 72
DATA 71 71 74 88 10 89 5 72 4 79 68 80 71 71 74 92
DATA 10 93 5 72 4 79 68 80 71 71 78 41 14 42 5 72
DATA 4 79 68 80 71 71 79 32 15 32 15 32 15 32 15 32
DATA 15 32 15 32 15 32 15 32 15 32 15 32 15 32 5 72
DATA 71 71 10 90 10 91 5 72 4 81 68 84 71 71 14 35
DATA 14 36 5 72 4 81 68 84 71 71 14 43 14 44 5 72
DATA 4 81 68 84 71 71 15 32 15 32 15 32 15 32 15 32
DATA 15 32 15 32 15 32 15 32 15 32 15 32 15 32 5 72
DATA 71 71 71 32 71 32 5 72 4 83 68 82 71 71 71 32
DATA 71 32 5 72 4 83 68 82 71 71 10 32 10 32 5 72
DATA 4 83 68 82 71 71 15 32 15 32 15 32 15 32 15 32
DATA 15 32 15 32 15 32 15 32 15 32 15 32 15 32 5 72
DATA 5 73 5 74 5 74 5 75 4 85 68 86 5 73 5 74
DATA 5 74 5 75 4 85 68 86 5 73 5 74 5 74 5 75
DATA 4 85 68 86 5 73 5 74 5 74 5 74 5 74 5 74
DATA 5 74 5 74 5 74 5 74 5 74 5 74 5 74 5 75A menos que uses RESTORE, usar READ de este modo hace que MPAGD sepa automáticamente que debe continuar desde donde se quedó la última vez que hizo READ, por eso podemos crear unos bucles REPEAT sencillos para construir todo el HUD
Y eso es todo. Yo decidí ponerlo en mi script de GAME initialisation, de modo que solo se llama una vez, cuando empieza el juego; luego uso CLW (que solo borra el área de juego, no el HUD) en mi script RESTART SCREEN.
También uso CHR y COLOUR dentro del código de mi juego para asegurarme de que el HUD muestre los iconos correctos de las armas y objetos que el jugador tiene seleccionados en ese momento.
¿El efecto neto? Me ahorró la mayor parte de 350 bytes, que se pueden usar en otras cosas más importantes.
¡Hurra!
