Recargas de combustible – parte 1

Vamos a incluir los tanques de combustible que nos permitirán recargar los jetpacks. Como todo esto tiene una complejidad extra voy a dividir la entrada en varias partes. La idea es que cada cierto tiempo caigan desde el cielo tanques de combustible (bien espaciados, cosa que sean escasos, y obligue a los jugadores a luchar por ellos).
Ademas, dichos tanques pueden ser destruidos con los disparos… esto tiene un doble filo, ya que permite destruir un tanque que el otro jugador esté a punto de tomar, o también puede ocurrir que lo destruyamos por disparar a lo loco.

Pero antes… un video de lo que quedó:

Los tanques caerán aleatoriamente desde diferentes posiciones X de la pantalla. Para esto necesitamos un generador de números aleatorios, en nuestro caso algo muy sencillo, que tire números de un byte de longitud, es decir, entre 0 y 255 valores diferentes. Si bien la pantalla de la C64 tiene 320 pixels, para simplificar un poco la cuestión vamos a hacer que los tanques caigan entre la posición 48 y la posición 303.
El código lo tome de codebase64.org, concretamente aquí. Es una pequeña subrutina, que llamamos en cada loop, y lo que hace es guardar un numero aleatorio de 1 byte de longitud en la posición de memoria random.

randomGenerator
          lda            random      ; cargo en A el contenido de random
          beq            @doEor      ; si es 0 hace un EOR con $1d, y lo guarda en random nuevamente
          asl                        ; si no, hago un shift left 
          beq            @noEor      ; si la op es 0, guarda en random
          bcc            @noEor      ; si hay carry, guarda en random
@doEor    eor            #$1d        ; y si llego aca, hace un eor 00011101 (para 'randomizarlo' un poco)
@noEor    sta            random      ; finalmente guarda el valor generado
          rts

El código es muy básico, y no demasiado aleatorio… genera los números aleatorios multiplicando por 2 (asl) y/o aplicando un eor con un numero (en este caso $1d). Viendo la rutina en acción veo que hay una tendencia a que genere números altos, los tanques tienden a caer del lado derecho de la pantalla, pero a los efectos que necesitamos en el juego esta… mas que bien.

Para que la rutina funcione correctamente es necesario inicializar random. Para ello vamos a utilizar una dirección de memoria de la C64, concretamente la posición de memoria $a2, que contiene el byte menos significativo de la variable TI del sistema, concretamente es un timer interno de la computadora, lo que nos dará una inicialización mas o menos aleatoria. El código de inicialización lo ponemos en initVars.asm:

          ldx            $a2         ; inicializamos el generador de numeros aleatorios
          stx            random      ; con un valor de la variable TI (que esta en $a2)

Como siempre, el codigo completo lo pueden bajar desde el repositorio:
https://github.com/moonorongo/jp_wars.git
En la próxima entrega vamos a implementar la maquina de estados para que caiga un tanque de combustible cada cierto intervalo de tiempo.
Hasta la proxima!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s