Minilop Retroware

MPAGD Principiantes · Parte 22 de 29

Vamos a crear un juego con MPAGD - Parte 22: Trabajar con texto, MESSAGEs, CHaRacters y PRINTMODE

30 de octubre de 2021

Hasta ahora hemos aprendido a poner información en pantalla con comandos como PRINT "" y DISPLAY, además de algunos especiales como SHOWSCORE y SHOW BONUS.

Como ya he mencionado, escribir juegos de Speccy es un reto por la falta de memoria con la que se trabaja y, por desgracia, el texto puede ocupar bastante. Pero tenemos a nuestra disposición algunas herramientas que podemos emplear con cuidado para reducir la cantidad de memoria que ocupará el texto de nuestro juego.

MPAGD te permite guardar una lista de mensajes de texto que luego puedes invocar cuando los necesites en tu juego. Puedes usar esta función para prácticamente todo el texto de tu juego; de hecho, te aconsejo que lo hagas. Cuando escribo un juego intento minimizar el número de veces que uso comandos PRINT,

¿Por qué?

Los mensajes de texto son REUTILIZABLES.

PRINT siempre espera una cadena de texto como:

PRINT "Stinky Dog"

Podría usar eso en nuestra INTRO SCREEN, encima del menú de controles, para mostrar el título de nuestro juego

Quizá, cuando el jugador complete la pantalla, también podríamos mostrar el texto "Well Done Stinky Dog!" encima del calculador de bonificación usando

PRINT "Well Done Stinky Dog!"

Pero al hacerlo, en el código fuente de nuestro juego tendríamos las palabras "Stinky Dog" almacenadas dos veces... ocupando el doble de memoria.

Puede que sean solo unos pocos bytes, pero créeme, esos bytes podrían aprovecharse mejor.

Sería mejor, entonces, tener una lista de mensajes,

"Stinky Dog"

"Well Done"

Entonces podría llamar al primer mensaje siempre que quiera mostrar las palabras Stinky Dog, y al segundo siempre que quiera las palabras "Well Done"

Se guarda una vez, se usa muchas.

Crear tus mensajes es fácil: en el menú EDITOR selecciona "Text Messages"

Probablemente te saldrá un documento en blanco.

Al principio, escribe:

DEFINEMESSAGES

Necesitamos esta etiqueta para que MPAGD sepa que lo que viene a continuación son mensajes que queremos guardar

DEFINEMESSAGES
"STINKY DOG"                                         ; 0
"WELL DONE"                                          ; 1

También he añadido un comentario con el número en cada línea. No tienes por qué hacerlo, pero te aconsejo encarecidamente que lo hagas, porque te será más fácil identificar el mensaje correcto más adelante, a medida que crezca nuestro código.

Como con todo, empezamos en cero, no en uno, así que el primer mensaje es el mensaje n.º 0.

La forma de decirle a MPAGD que muestre un mensaje en pantalla es con el comando:

MESSAGE x

Donde x es el número del mensaje en la lista.

Vamos a probarlo. Abre tu evento INTRO MENU y añade el código resaltado de abajo:

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

Vale, ejecuta el juego y ahora deberías ver esto:

Captura de pantalla del tutorial

Sin embargo, podríamos hacer que el título de nuestro juego destaque más cambiando el PRINTMODE. Ahora mismo nuestro texto tiene la altura de un solo carácter, que es la predeterminada y corresponde a PRINTMODE 0. Pero podríamos cambiarlo a doble altura de carácter usando PRINTMODE 1.

Como aprendimos con COLOUR, INK, etc., lo que cambiemos afectará a todo el texto y los números de la pantalla a menos que nuestro código le diga que cambie a otra cosa. Así que si queremos que Stinky Dog salga a doble altura pero el resto a altura simple, tenemos que volver a PRINTMODE 0 después de imprimir STINKY DOG... así:

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

Ahora tu intro menu se verá así:

Captura de pantalla del tutorial

Ahora vamos a añadir un signo de exclamación al final de Stinky Dog. Esta vez no voy a guardar "!" como mensaje de texto, sino que lo voy a llamar directamente con su CHR (número de carácter).

Pero ¿cuál es su número? Sin entrar en tecnicismos... aquí tienes una chuleta:

Captura de pantalla del tutorial

Así que '!' es el carácter número 33. Podemos llamarlo y mostrarlo en la posición actual del cursor en pantalla simplemente usando CHR 33 en nuestro evento intro menu, así:

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)

Ahora nuestro intro menu debería verse así:

Captura de pantalla del tutorial

Ahora vamos a añadir algunos mensajes de texto más. Abre tu archivo de mensajes de texto:

DEFINEMESSAGES
"STINKY DOG"          ;0
"WELL DONE"           ;1
"SCORE"               ;2
"FART"                ;3
"BONUS"               ;4
"PRESS KEY TO START"  ;5
"LIVES"               ;6

Ahora vamos a actualizar nuestro evento COLLECT BLOCK, en concreto la parte que controla lo que ocurre cuando se recoge el último hueso, Y AÑADE EL CÓDIGO RESALTADO:

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

Ahora vamos a hacer una prueba de juego:

Vale, esto empieza a verse mejor.

Ahora que también tenemos SCORE y BONUS guardados como mensajes de texto, podemos volver a nuestro RESTART SCREEN y sustituir allí los comandos PRINT por MESSAGEs, de modo que reutilicemos el texto y ahorremos unos cuantos 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 

Puede parecer un fastidio hacerlo así, pero créeme, a la larga merece la pena. Cada byte extra que ahorramos es uno que podemos usar para mejorar el juego, así que intentar mantener todo lo más eficiente posible dará sus frutos a medida que nuestro juego se desarrolle.

Otra ventaja de tener todo el texto en el archivo de mensajes de texto es que resulta muchísimo más fácil traducirlo a otros idiomas, en lugar de rebuscar en todo tu código para encontrar un montón de comandos PRINT y editarlos.

Veremos más sobre los mensajes de texto a medida que nuestro juego vaya cogiendo forma, pero espero que los últimos tutoriales te hayan dado una buena comprensión de lo básico.

SIGUIENTE: PARTE 23: Añadir sonidos básicos con BEEP y CRASH

Todo MPAGD Principiantes