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
CLSVale, ejecuta el juego y ahora deberías ver esto:

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
CLSAhora tu intro menu se verá así:

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:

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

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
