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:

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

Vamos compilar o jogo outra vez:

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:

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

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.

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

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
