Asteroids: pantalla inicial y pantalla de juego – comienzo de partida #Programación retro del Commodore 64

Tras pintar la pantalla inicial / final, y en su caso las puntuaciones, hay que pedirle al usuario que dé algún tipo de indicación de que quiere comenzar una partida. Típicamente se trata de pulsar una tecla o el disparo del joystick.

Dado que ya estábamos usando el joystick 2 para mover la nave y disparar, inicialmente pensé en usar el disparo para dar paso a la partida. Y llegué a implementar el código de este modo:

Asteroids - Inicio partida con disparo

Es decir:

  • Leemos el joystick 2 y cargamos lo leído en la variable "joy2".
  • Hacemos un AND de la máscara Disparo = %00010000 y la variable "joy2", es decir, nos quedamos con el bit 4 de "joy2". Ese bit corresponde al disparo del joystick 2.
  • Si el bit 4 vale 1, volvemos a empezar. Recordemos que la señal para marcar un disparo (o un movimiento del joystick) no es 1, sino 0.
  • Si el bit 4 vale 0 es que se ha disparado. Por tanto, continuamos la ejecución con lo que sigue, que es la inicialización del juego.

El código funciona, pero tiene un problema. Cuando uno está afanado matando asteroides, y viene a visitarle "La Parca" porque ya no le quedan vidas, lo más normal es que le pille a uno pulsando el disparo frenéticamente. Al menos, morir matando, ¿no? Y en circunstancias como éstas es muy fácil morir, salir a la pantalla inicial, seguir disparando todo loco, y volver e empezar –sin querer– otra partida.

Total, hay que buscarle solución. ¿Qué tal el teclado? El juego de momento no lo usa, así que puede ser una buena solución al problema anterior, aparte de una buena oportunidad para aprender y practicar cosas nuevas.

Para leer del teclado una opción es usar la rutina "GETIN" del Kernal. Hay otras rutinas (ej. "SCNKEY"), pero "GETIN" es fácil de usar. Su definición es así:

Asteroids - Getin.PNG

Es decir, "GETIN" lee un byte de la entrada estándar, que por defecto es el teclado, y lo deposita en el acumulador. Más fácil imposible.

Total, nos queda este código sencillito, si lo que queremos es que el usuario pulse el espacio para jugar:

Asteroids - Inicio partida con espacio.PNG

Es decir:

  • Leemos el teclado con "jsr getin".
  • Si el byte leído es 0, no se ha pulsado una tecla. Por tanto, volvemos a leer el teclado.
  • Si el byte leído no es 0, se ha pulsado una tecla. Si no es el espacio (32), volvemos a leer el teclado. Si sí es el espacio, continuamos con la inicialización del juego, es decir, iniciamos la partida.

En realidad, el salto condicional "beq menuBucle" se podría considerar subsumido en "cmp #32" y "bne menuBucle", ya que si el acumulador vale 0 está claro que tampoco vale 32. Vamos, que se podría simplificar. Pero está bien saber cómo comprobar si ha habido pulsación o no en general, sin comprobar una tecla específica. Esto se hace comparando con 0.

Y no tiene mucho más misterio… Pero nos ha servido para aprender a usar el teclado, que lógicamente es algo de lo más interesante.

El código de aplicación sigue siendo el de la versión 20. Y en la próxima entrada controlaremos el final de la partida, la visita de "La Parca" …


Código del proyecto: Asteroids20


Editar

Josepzin

No hay comentarios:

Publicar un comentario