Asteroids: pantalla inicial y pantalla de juego (paso I) #Programación retro del Commodore 64

Hasta ahora nos hemos centrado en la pantalla de juego, que es la principal. Ahora bien, los juegos suelen tener una pantalla inicial o de carga, la pantalla o pantallas de juego, y una pantalla final que típicamente muestra las puntuaciones y los records.

Esto es lo que vamos a hacer en esta entrada y las que siguen: añadir una pantalla inicial y una pantalla final. En realidad, si la pantalla inicial la reutilizamos tanto para el comienzo del juego como para el final del juego (añadiendo las puntuaciones en este caso), entonces sólo necesitamos una pantalla nueva: la pantalla inicial / final.

Añadir una pantalla inicial a la pantalla de juego implica hacer todo esto:

  • Por supuesto, diseñar la pantalla inicial y exportarla a un fichero.
  • Cargar la pantalla inicial igual que el resto de los recursos.
  • Al empezar el juego, pintar la pantalla inicial.
  • Pedir al usuario que pulse una tecla o el disparo del joystick. Mientras no lo haga, esperar.
  • A partir del momento en que el usuario pulsa la tecla o el disparo, inicializar el juego como hasta ahora (inicializar la pantalla de juego, el jugador y los asteroides), y entrar en el bucle de juego también como hasta ahora (actualizar la pantalla de juego, el jugador, los disparos y los asteroides).

Además, habrá que detectar una condición de finalización de la partida, que en nuestro caso será que las vidas del jugador lleguen a cero. Hasta ahora no estábamos controlando esta situación, pero tenemos que empezar a hacerlo.

A partir de ahora, cada vez que la nave choque con un asteroide, además de restar una vida al jugador, controlaremos si las vidas han llegado a cero. En caso negativo, seguiremos jugando. Y en caso afirmativo, terminaremos la partida volviendo a la pantalla inicial que, ahora sí, mostrará los puntos conseguidos y el record de la sesión de partidas.

Vamos con los primeros pasos:

Diseño y exportación de la pantalla inicial:

Aquí hay pocas novedades, porque ya hemos diseñado varias pantallas. Se trata de diseñar una pantalla nueva con el editor de pantallas de CBM prg Studio:

Asteroids - Pantalla inicial.PNG

No es necesario utilizar un fichero nuevo. Se puede reutilizar el fichero "Pantallas.sdd" añadiendo una nueva pantalla.

Hay que exportar y cargar la nueva pantalla. Es perfectamente posible hacerlo conjuntamente con la pantalla de juego, en un único fichero de exportación / carga, pero en mi caso he hecho dos exportaciones a ficheros independientes: "Pantallas.bin" para la pantalla de juego y "PantallaMenu.bin" para la pantalla inicial / final.

Por cierto, otra alternativa perfectamente posible, y muy usada, sería diseñar y cargar un bonito bitmap.

Carga de la pantalla inicial:

El siguiente paso es hacer la carga desde "Recursos.asm".

Al hacerlo, si mantenéis el orden previo de carga (sprites, pantallas y caracteres) veréis que las dos pantallas que tenemos ahora, y que ocupan 1.000 caracteres cada una (total 2.000), no caben en el hueco de memoria entre sprites (que empiezan en $3000) y caracteres (que empezaban en $3800). Esto es lógico, porque $3800 – $3000 = $800 = 2.048, pero de ahí hay que descontar lo que ocupan los sprites (12 sprites x 64 bytes = $300 = 768).

Total, hay que rediseñar la carga en memoria. Esto se ve en el nuevo fichero "Recursos.asm":

Asteroids - Nueva carga recursos.PNG

La idea básica es cargar las pantallas a partir de los caracteres personalizados, no antes.

Pintado de la pantalla inicial:

Antes, al empezar al juego nos íbamos directos a pintar / inicializar la pantalla de juego (ver llamada "jsr inicializaPantalla"):

Asteroids - Pintado pantalla juego

Ahora, al empezar el juego tenemos que pintar / inicializar la pantalla inicial (ver llamada "jsr inicializaPantallaMenu"):

Asteroids - Pintado pantalla inicial.PNG

Además, y sólo cuando la variable "jugadorPuntos" sea distinta de cero, es decir, cuando vengamos de terminar una partida previa, también se pintarán los puntos con la rutina "pintaPuntos". Por tanto, con el juego recién cargado, no se pintarán los puntos; tras jugar una partida sí se pintarán.

La nueva rutina "inicializaPantallaMenu" tiene esta definición:

Asteroids - Rutina pantalla inicial.PNG

Todo lo que tiene que ver con la configuración de los colores del borde, del fondo y de los caracteres se ha movido de la rutina "inicializaPantallaJuego" a la nueva, puesto que no tiene sentido ejecutar esa configuración varias veces (salvo que hubiera cambios de color, lo cual no es el caso).

Pintado de los puntos:

La rutina "pintaPuntos", que se invoca tras pintar la pantalla inicial cuando los puntos del jugador no son cero, tiene esta otra definición:

Asteroids - Pinta puntos.PNG

Es decir, esta rutina pinta el literal "PUNTOS:" y los puntos del jugador, así como el literal "MÁXIMO:" y el máximo de puntos de la sesión.

En todos los casos, el pintado se hace en posiciones específicas de la RAM de vídeo, que se indican como parámetros de entrada a las rutinas. Esto ya era posible con los números (ver rutina "pintaHex2" de la librería "LibText"), pero todavía no era posible con las cadenas. Para ello ha sido necesario mejorar la librería "LibText" con una nueva rutina "pintaCadena3".

Resultado:

El resultado con el juego recién cargado es éste:

Asteroids - Pantalla inicial sin puntos.PNG

Y tras terminar una partida es este otro:

Asteroids - Pantalla inicial con puntos.PNG

Todo esto puede verse en la versión 20 del proyecto.

En las entradas que siguen completaremos las explicaciones que faltan (pulsación de una tecla o del disparo del joystick, control del final de la partida, etc.).


Código del proyecto: Asteroids20


Editar

Josepzin

No hay comentarios:

Publicar un comentario