O meu projeto atual, The Swarm is Coming..., tem um HUD (Head Up Display) bem desenhado (ou pelo menos acho eu) que mostra a arma atual, a saúde, mensagens e assim por diante.


Quando o criei pela primeira vez, desenhei-o com blocos. Depois, no meu script de Game Initialisation, transformei-o em código usando PUTBLOCK.
Foi uma ideia estúpida.
Por várias razões.
Primeiro, exigiu uma longa sequência de código, muitos ciclos REPEAT, muitos PUTBLOCK e assim por diante.
Nada eficiente.
Segundo, estou a desenvolver o jogo com Adventure Mode e, no modo aventura, o MPAGD guarda dados de quaisquer PUTBLOCK que ocorram durante o jogo, de modo que um ecrã que muda (talvez se removeres um bloco de parede e o substituíres por um bloco vazio para, digamos, uma porta que foi desbloqueada) mantenha os novos blocos se o ecrã for redesenhado ou se voltar a entrar nele.
Ora, o meu HUD é interativo, por isso, quando o jogador seleciona uma arma diferente, o ícone da bala no HUD muda.
Experimenta fazer isso no modo aventura com PUTBLOCK! O jogo ficará sem memória rapidamente.
A solução esteve sempre mesmo à minha frente. Uma das ferramentas mais poderosas do MPAGD: DATA & READ.
E, claro, a possibilidade de redefinir o tipo de letra.
Então pus-me a redefinir o tipo de letra, substituindo os carateres que o jogo não vai usar pelos gráficos do meu HUD.
Cada caráter do tipo de letra (neste caso, os nossos gráficos do HUD) pode ser chamado com o comando CHR, desde que saibamos o seu número.
Assim é como o meu tipo de letra está agora:

CHR começa em 32 (o 32 é um espaço em branco... provavelmente vais precisar dele, por isso é melhor não o redefinir!)
Vais reparar que tive de fazer aqui uma cedência: só tenho um conjunto de maiúsculas ou minúsculas, tudo em maiúsculas, mas não foi um grande sacrifício para mim.
Assim, o primeiro CHR do tipo de letra é o 32, depois o 33, o 34 e assim por diante. Portanto, vamos precisar de controlar o número de CHR de cada gráfico do HUD.
Ok, depois de fazeres isto provavelmente terás reparado num problema... Os tipos de letra não têm cores como o editor de BLOCK; a forma mais eficiente é usar o comando COLOUR que, tal como CHR, precisa de um número de 8 bits para definir os atributos de papel, tinta, brilho e intermitência (flash).
Aqui tens uma prática tabela de referência para recortar e guardar que fiz...

Assim, a cor 1 é tinta azul escura sobre papel preto, e a cor 93 é tinta ciano brilhante sobre papel magenta brilhante. Nota que as cores 123 e superiores têm o atributo Flash... que obviamente não funciona bem numa imagem estática!
Para cada linha horizontal do meu HUD devo agora ter uma lista de CHR e COLOUR.
Então vamos pô-los numa ou mais instruções DATA
Deves introduzir os teus DATA em formato de pares:
DATA (COLOUR#) (CHR#) (COLOUR#) (CHR#) (COLOUR#) (CHR#) .... e assim por diante
Cada instrução DATA pode ter 16 destes números (8 pares)
Assim, a tua primeira instrução DATA definirá os primeiros 8 carateres (na horizontal) do teu HUD
Se o teu jogo usa a largura total do ecrã, vais precisar portanto de 4 instruções DATA para definir por completo cada linha do teu HUD (o meu usa 6 linhas de largura total)
Depois de definires por completo os teus DATA, só precisamos de um pequeno script que faça READ dos valores de CHR e COLOUR de cada célula do HUD e depois os mostre no ecrã... algo assim:
; 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 desta forma faz com que o MPAGD saiba automaticamente que deve continuar de onde ficou da última vez que fez READ, e é por isso que podemos criar uns ciclos REPEAT simples para construir todo o HUD
E é isto. Decidi colocá-lo no meu script de GAME initialisation, para que só seja chamado uma vez, quando o jogo começa; depois uso CLW (que só limpa a área de jogo, não o HUD) no meu script RESTART SCREEN.
Também uso CHR e COLOUR dentro do código do meu jogo para garantir que o HUD mostra os ícones corretos das armas e itens que o jogador tem selecionados no momento.
O efeito final? Poupou-me a maior parte de 350 bytes, que podem ser usados noutras coisas mais importantes.
Viva!
