Minilop Retroware

MPAGD Iniciantes · Parte 22 de 29

Vamos criar um jogo com o MPAGD - Parte 22: Trabalhar com texto, MESSAGEs, CHaRacters e PRINTMODE

30 de outubro de 2021

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
CLS

Ok, executa o jogo e agora deves ver isto:

Captura de ecrã do tutorial

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
CLS

Agora o teu intro menu vai ficar assim:

Captura de ecrã do tutorial

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:

Captura de ecrã do tutorial

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:

Captura de ecrã do tutorial

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

Todo o MPAGD Iniciantes