Minilop Retroware

MPAGD Avançado

O HUD supereficiente

14 de maio de 2021

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.

Captura de ecrã do tutorialCaptura de ecrã do tutorial

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:

Captura de ecrã do tutorial

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...

Captura de ecrã do tutorial

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 75

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

Todo o MPAGD Avançado