Minilop Retroware

MPAGD Iniciantes · Parte 21 de 29

Vamos criar um jogo com o MPAGD - Parte 21: Alterar tipos de letra, COLOUR, PAPER, INK e CLUT

30 de outubro de 2021

Na nossa última lição vimos como trabalhar com a pontuação do jogador (SCORE), BONUS e como a mostrar no ecrã com DISPLAY, e também como usar AT e PRINT para mostrar texto e informação adicional.

Mas visualmente fica um pouco sensaborão.

Felizmente, o MPAGD tem um editor de tipos de letra e alguns bancos de tipos de letra entre os quais escolher. Vamos então dar uma vista de olhos: no Editor Menu, seleciona Font:

Captura de ecrã do tutorial

Este ecrã tem três partes.

Em cima, à esquerda, temos um editor de caracteres. Funciona um pouco como o editor de blocos: é uma grelha de 8x8 e podemos clicar nas células para editar o caráter. Repara que este editor não tem seletor de cor: a cor dos caracteres do tipo de letra é tratada de outra forma, que veremos mais à frente.

Em cima, à direita, temos o banco de tipos de letra atual. Se clicarmos em qualquer um dos caracteres do banco, aparecerá no editor de caracteres... e poderemos editá-lo.

Em baixo há 12 conjuntos de tipos de letra já estilizados. Se clicares num deles, passará a ser o tipo de letra que o nosso jogo vai usar.

Temos portanto uma escolha: podemos usar a predefinida, editá-la e criar a nossa, ou instalar uma das já feitas.

Pessoalmente, costumo criar os meus próprios tipos de letra para os meus jogos, mas gosto bastante do terceiro da coluna do meio dos já feitos, por isso vou usá-lo como ponto de partida. Só tenho de clicar para o instalar... Vai aparecer-me uma mensagem de aviso a perguntar se quero substituir o tipo de letra existente, sim, por favor!:

Captura de ecrã do tutorial

Vamos compilar o jogo outra vez:

Captura de ecrã do tutorial

A primeira coisa que vemos é o INTRO MENU e, sim, já usa o tipo de letra que instalámos. Mas o texto preto sobre cinzento é um pouco aborrecido. Vamos então mudá-lo: no menu Events seleciona Intro Menu. Ainda não vou explicar exatamente como funciona, voltamos a isso mais tarde, mas por agora vamos apenas mudar as cores acrescentando três linhas de código no topo:

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

Executa o jogo e vejamos a mudança:

Captura de ecrã do tutorial

Agora temos uma moldura preta, um ecrã preto e texto ciano escuro. Definimos isto incluindo um número depois de cada comando, mas como sabemos que número corresponde a que cor?

No menu Editor seleciona Palette:

Isto mostrará as cores disponíveis (estou a usar um ZX Spectrum standard, por isso é isto que vou ver: (desenhei os números muito mal!)

Captura de ecrã do tutorial

A fila de cima mostra as cores normais, de 0 a 7

Depois, na segunda fila, temos as versões brilhantes.

Então, porque é que não podemos simplesmente acrescentar um número para o INK BRIGHT CYAN no nosso comando INK?

Pois o problema é que o Spectrum só tem realmente 8 cores, mas também tem um atributo BRIGHT, e só consegue mostrar BRIGHT INK sobre BRIGHT PAPER

Por isso, se quisermos ter BRIGHT CYAN sobre preto, vamos precisar de mudar a Colour Look Up Table para a BRIGHT. Fazemos isso acrescentando o comando CLUT

O CLUT, no Spectrum, tem 4 valores possíveis:

CLUT 0 ; as cores normais predefinidas

CLUT 1 ; cores brilhantes

CLUT 2 ; cores normais intermitentes

CLUT 3 ; cores brilhantes intermitentes

Mudemos para CLUT 1 editando o início do nosso evento Intro Menu:

BORDER 0
CLUT 1
PAPER 0
INK 5

Executa o jogo e agora temos o texto brilhante.

Captura de ecrã do tutorial

Mas isso levou-nos três linhas de código para definir os 'atributos de ecrã permanentes', e o MPAGD dá-nos um atalho para fazer as três coisas de uma só vez: o comando COLOUR.

COLOUR aceita um único valor de 8 bits (0-255) para definir de uma só vez a tinta, o papel, o brilho ligado ou desligado e a intermitência ligada ou desligada. Aqui tens um exemplo dos valores disponíveis:

(repara que os valores a partir de 123 são as versões intermitentes!)

Captura de ecrã do tutorial

Assim, pela tabela acima, vejo que o valor 69 é tinta ciano brilhante sobre papel preto, sem intermitência.

Por isso posso mudar o código no início do meu evento Intro Menu para:

BORDER 0
COLOUR 69

Executa o jogo e deve ficar exatamente igual.

Pessoalmente, costumo usar COLOUR quando quero mudar as cores de qualquer texto no meu jogo.

Repara que ainda preciso de definir a cor do BORDER em separado, COLOUR não muda a moldura, mas não faz mal, vou incluí-lo no evento Intro menu.

As cores que escolheres mantêm-se até o teu código dizer ao jogo para fazer outra coisa. Assim, agora a nossa barra de pontuação no topo do ecrã também tem texto ciano sobre preto.

Claro que podemos mudar isto acrescentando com cuidado comandos COLOUR (ou PAPER & INK) onde forem necessários. Vamos acrescentar alguns ao nosso evento RESTART SCREEN, que é o que desenha primeiro a nossa barra de pontuação:

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 

Isso deve animar um pouco o jogo... vamos testá-lo:

Ok, começa como esperado, mas assim que recolho um osso, o valor da pontuação fica vermelho.

Isto acontece porque o último comando COLOUR que usámos é COLOUR 66 (vermelho sobre preto), e também temos um comando SHOWSCORE no nosso evento COLLECT BLOCK, por isso vamos precisar de o atualizar com a nossa cor preferida para mostrar a pontuação, ou seja, COLOUR 71 ; branco brilhante sobre preto:

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

;...

e, como também atualizamos as LIVES quando o jogador é morto, vamos precisar de acrescentar também o COLOUR correto aí, para que o número de vidas seja sempre vermelho brilhante sobre preto. Vamos então editar o 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 e executa o jogo...

Bem, parece estar tudo a funcionar bem...

O ecrã do Intro Menu é um pouco aborrecido, no entanto. Podíamos pelo menos acrescentar-lhe o título do nosso jogo, e é disso que vamos tratar a seguir.

SEGUINTE: PARTE 22: Trabalhar com texto, MESSAGEs, CHaRacters e PRINTMODE

Todo o MPAGD Iniciantes