Até agora aprendemos a pôr informação no ecrã com comandos como PRINT "" e DISPLAY, além de alguns especiais como SHOWSCORE e SHOW BONUS.
Como já referi, escrever jogos de Speccy é um desafio devido à falta de memória com que se trabalha e, infelizmente, o texto pode ocupar bastante. Mas temos à nossa disposição algumas ferramentas que podemos empregar com cuidado para reduzir a quantidade de memória que o texto do nosso jogo vai ocupar.
O MPAGD permite-te guardar uma lista de mensagens de texto que depois podes chamar quando forem necessárias no teu jogo. Podes usar esta funcionalidade para praticamente todo o texto do teu jogo; na verdade, aconselho-te a fazê-lo. Quando estou a escrever um jogo tento minimizar o número de vezes que uso comandos PRINT,
Porquê?
As mensagens de texto são REUTILIZÁVEIS.
PRINT espera sempre uma cadeia de texto como:
PRINT "Stinky Dog"
Podia usar isso no nosso INTRO SCREEN, por cima do menu de controlos, para mostrar o título do nosso jogo
Talvez, quando o jogador completar o ecrã, também pudéssemos mostrar o texto "Well Done Stinky Dog!" por cima do calculador de bonificação usando
PRINT "Well Done Stinky Dog!"
Mas ao fazê-lo, no código-fonte do nosso jogo teríamos as palavras "Stinky Dog" armazenadas duas vezes... a ocupar o dobro da memória.
Podem ser apenas uns poucos bytes, mas acredita, esses bytes podiam ser mais bem aproveitados.
Seria melhor, então, ter uma lista de mensagens,
"Stinky Dog"
"Well Done"
Assim, podia chamar a primeira mensagem sempre que quisesse mostrar as palavras Stinky Dog, e a segunda sempre que quisesse as palavras "Well Done"
Guarda-se uma vez, usa-se muitas.
Criar as tuas mensagens é fácil: no menu EDITOR seleciona "Text Messages"
Provavelmente vai aparecer-te um documento em branco.
No início, escreve:
DEFINEMESSAGES
Precisamos desta etiqueta para que o MPAGD saiba que o que se segue são mensagens que queremos guardar
DEFINEMESSAGES "STINKY DOG" ; 0 "WELL DONE" ; 1
Também acrescentei um comentário com o número em cada linha. Não és obrigado a fazê-lo, mas aconselho-te vivamente a fazê-lo, porque vai ser mais fácil identificares a mensagem certa mais tarde, à medida que o nosso código crescer.
Como com tudo, começamos em zero, não em um, por isso a primeira mensagem é a mensagem n.º 0.
A forma de dizer ao MPAGD para mostrar uma mensagem no ecrã é com o comando:
MESSAGE x
Onde x é o número da mensagem na lista.
Vamos testar. Abre o teu evento INTRO MENU e acrescenta o código realçado abaixo:
EVENT INTROMENU
BORDER 0
COLOUR 5
LET CONTROL = 99
WHILE CONTROL >= 99
CLS
AT 4 10 ; at line 4 column 10
MESSAGE 0 ; display the game title
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
CLSOk, executa o jogo e agora deves ver isto:

No entanto, podemos fazer com que o título do nosso jogo se destaque mais mudando o PRINTMODE. Neste momento o nosso texto tem a altura de um único caráter, que é a predefinida e corresponde a PRINTMODE 0. Mas podíamos mudá-lo para altura dupla de caráter usando PRINTMODE 1.
Como aprendemos com COLOUR, INK, etc., aquilo para que mudarmos afetará todo o texto e números no ecrã, a menos que o nosso código lhe diga para mudar para outra coisa. Assim, se quisermos que o Stinky Dog apareça em altura dupla mas o resto em altura simples, temos de voltar a PRINTMODE 0 depois de imprimirmos STINKY DOG... assim:
EVENT INTROMENU
BORDER 0
COLOUR 5
LET CONTROL = 99
WHILE CONTROL >= 99
CLS
PRINTMODE 1 ; print the following text in double height
AT 4 10 ; at line 4 column 10
MESSAGE 0 ; display the game title
PRINTMODE 0 ; revert back to normal height text.
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
CLSAgora o teu intro menu vai ficar assim:

Agora vamos acrescentar um ponto de exclamação no fim de Stinky Dog. Desta vez não vou guardar "!" como mensagem de texto, vou chamá-lo diretamente usando o seu CHR (número do caráter).
Mas qual é o seu número? Sem entrar em tecnicismos... aqui tens uma cábula:

Assim, '!' é o caráter número 33. Podemos chamá-lo e mostrá-lo na posição atual do cursor no ecrã simplesmente usando CHR 33 no nosso evento intro menu, assim:
EVENT INTROMENU
BORDER 0
COLOUR 5
LET CONTROL = 99
WHILE CONTROL >= 99
CLS
PRINTMODE 1 ; print the following text in double height
AT 4 10 ; at line 4 column 10
MESSAGE 0 ; display the game title
CHR 33 ; display a !
PRINTMODE 0 ; revert back to normal height text.
AT 8 10
{rest of code omitted)
Agora o nosso intro menu deve ficar assim:

Agora vamos acrescentar mais algumas mensagens de texto. Abre o teu ficheiro de mensagens de texto:
DEFINEMESSAGES "STINKY DOG" ;0 "WELL DONE" ;1 "SCORE" ;2 "FART" ;3 "BONUS" ;4 "PRESS KEY TO START" ;5 "LIVES" ;6
Agora vamos atualizar o nosso evento COLLECT BLOCK, em concreto a parte que controla o que acontece quando o último osso é recolhido, E ACRESCENTA O CÓDIGO REALÇADO:
EVENT COLLECTBLOCK SCORE 100 ; score 100 points when we collect a Bone AT 0 6 COLOUR 71 SHOWSCORE ; display the score SUBTRACT 1 FROM B ; decrement the number of bones left on screen IF B = 0 ; have all Bones been collected? CLS ; clear the screen AT 4 6 MESSAGE 1 ; "well done" CHR 32 ; " " MESSAGE 0 ; "stinky dog" CHR 33 ; "!" COLOUR 65 ; blue on black AT 7 15 MESSAGE 3 ; "fart" COLOUR 66 ; red on black AT 8 15 MESSAGE 4 ; "bonus" COLOUR 71 AT 10 6 ; at line 10, column 2... SHOWSCORE ; display the score DELAY 25 ; wait 1 second CHR 32 ; " " CHR 43 ; "+" CHR 32 ; " " DELAY 25 ; wait another second SHOWBONUS ; display the bonus DELAY 25 ; wait another second CHR 32 ; " " CHR 61 ; "=" CHR 32 ; " " DELAY 25 ; wait another second ADDBONUS ; add the bonus to the score ZEROBONUS ; reset the bonus to 0 now we've added it SHOWSCORE ; display the new score AT 15 8 ; at line 15 column 8 COLOUR 215 ; flashing white on red MESSAGE 5 ; "press key to start" WAITKEY ; wait for a key press NEXTLEVEL ; if so move to the next screen ENDIF
Agora vamos fazer um teste de jogo:
Ok, isto está a começar a ficar melhor.
Agora que também temos SCORE e BONUS guardados como mensagens de texto, podemos voltar ao nosso RESTART SCREEN e substituir aí os comandos PRINT por MESSAGEs, de modo a reutilizarmos o texto e pouparmos alguns bytes...
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 MESSAGE 3 ; "score" CHR 58 ; ":" COLOUR 71 ; bright white text on black AT 0 6 SHOWSCORE AT 0 21 COLOUR 6 ; dull yellow on black MESSAGE 6 ; "lives" CHR 58 ; ":" 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
Pode parecer uma maçada fazê-lo desta forma, mas acredita, compensa a longo prazo. Cada byte extra que poupamos é um que podemos usar para melhorar o jogo, por isso tentar manter tudo o mais eficiente possível vai dar frutos à medida que o nosso jogo se desenvolver.
Outra vantagem de manter todo o texto no ficheiro de mensagens de texto é que fica muito mais fácil traduzi-lo para outras línguas, em vez de andar às voltas pelo código todo à procura de montes de comandos PRINT para os editar.
Vamos ver mais sobre as mensagens de texto à medida que o nosso jogo for ganhando forma, mas espero que os últimos tutoriais te tenham dado uma boa compreensão do básico.
SEGUINTE: PARTE 23: Acrescentar sons básicos com BEEP e CRASH
