Disparos

Con el jetpac volando, ahora vamos a agregar una funcion para que dispare un laser. La teoria es sencilla: en el loop incluimos un llamado a una subrutina, que si tiene seteado un flag predefinido va a animar un disparo. Cuando el jugador pulse el disparo ponemos un flag en 1, asi la rutina procede a hacer lo suyo. El disparo sera un sprite sencillo, con solamente una linea horizontal, pero con la particularidad que estará ensanchada en el eje X (para ello utilizaremos uno de los registros del VIC)

Algunos detalles

Basicamente agregamos un sprite jetpacFire que es solamente una linea horizontal (simulando un laser) al que expandimos al doble. Agregamos las variables de memoria que utilizaremos para manejar dicho sprite, ademas de una variable de estado que denominaremos fire1 la que puede tener los siguientes estados:

  • 0 = No pasa nada
  • 1 = el usuario pulso disparo, entonces activo el sprite, lo posiciono en la pantalla y paso fire1 a 2
  • 2 = incremento la posicion X hasta que llegue al final de la pantalla (en realidad, hago un ADC, que es ADD con carry, si tengo desborde de acarreo entonces desactivo el sprite, y pongo fire1 a 0)

Optimizé el codigo un poco, al principio van a ver que estan todas las direcciones de memoria que ire utilizando, luego las definiciones de macro, agregue una que es para mover los datos a la posicion de memoria deseada… no me gusta del todo, espero en proximas revisiones hacer algo mejor.
También agregue la subrutina animateFire que la llamo dentro del loop, que hace lo que explique previamente. Miren el codigo, esta bien comentado.

Codigo

*         = $c000

raster    = $d012
cborde    = $d020
cfondo    = $d021
spractive = $d015
sprxpandX = $d01d          

; direcciones jetpac 
sprcolor  = $d027
sprpoint  = $07f8
sprx      = $d000
spry      = $d001
joy2      = $dc00
fire1     = $02         ; zero page direccion sin usar

; direcciones disparo
sprcolorFire  = $d028
sprpointFire  = $07f9
sprxFire      = $d002
spryFire      = $d003

; -----------------------------------------------------------
; MACROS ----------------------------------------------------
; -----------------------------------------------------------
defm      waitrt
@loop     ldx            raster
          cpx            #$0       
          bne            @loop     
          endm

; movedata origen, destino 
defm      movedata 
          ldx            #$0       
@loop     lda            /1,x  
          sta            /2,x   
          inx
          cpx            #$3f      
          bne            @loop
          endm

; -----------------------------------------------------------
; MAIN CODE -------------------------------------------------
; -----------------------------------------------------------
main      lda            #$00      
          sta            cborde     
          sta            cfondo

; posicionamos jetpac
          ldx            #172       
          stx            sprx
          ldx            #139       
          stx            spry

; posicionamos disparo
          ldx            #196       
          stx            sprxFire
          ldx            #139       
          stx            spryFire

          lda            #$01      
          sta            spractive ;activamos el sprite 0 

          lda            #$01      
          sta            sprcolor  ; jetpac color blanco

          lda            #$07      
          sta            sprcolorFire; fire color amarillo

          lda            #$02      
          sta            sprxpandX ; expandimos X el disparo.

          lda            #$0d      
          sta            sprpoint  ; sprite 0 en $0340

          lda            #$0e 
          sta            sprpointFire  ; sprite 0 en $0380

          lda            #$0       ; fire flag 0      
          sta            fire1     

          movedata       jetpac,$0340
          movedata       jetpacFire,$0380

main_loop
          jsr            chkJoystick
          jsr            animateFire

          waitrt
          jmp            main_loop 

exit
          rts                      ; BASIC

; -----------------------------------------------------------
; SUBRUTINAS ------------------------------------------------
; -----------------------------------------------------------
chkJoystick
          lda            joy2      
          cmp            #127      
          beq            next      

          lda            joy2      
          and            #1        ; up
          bne            chkDown   
          dec            spry      

chkDown   lda            joy2      
          and            #2        ; down
          bne            chkLeft   
          inc            spry      

chkLeft   lda            joy2      
          and            #4        ; left
          bne            chkRight  
          dec            sprx      

chkRight  lda            joy2      
          and            #8        ; right
          bne            chkFire   
          inc            sprx      

chkFire   lda            joy2      
          and            #16       ; fire
          bne            next      

          ldx            fire1     
          cpx            #0        
          bne            next      ; checkeo si ya disparo

          lda            #1        ; setea status fire1 
          sta            fire1     
          lda            #$03      
          sta            spractive ;activamos el sprite 1 

;         end check joystick          

next
          rts
; -------------------------------------------

animateFire
          ldx            fire1     
          cpx            #$0       
          bne            @initFire
          rts                      ; vuelve si status fire es 0

@initFire
          ldx            fire1     
          cpx            #$1       
          bne            @loop     
; init fire (status 1)          
          ldx            spry
          stx            spryFire  

          lda            sprx      
          adc            #12
          sta            sprxFire
          inc            fire1     ; paso a status 2 (disparando)

@loop
          lda            #3        
          adc            sprxFire  ; incremento 3 x disparo
          sta            sprxFire  

          bcs            @setStatus0
          jmp            @next     

@setStatus0          
          ldx            #$0       ; si no seteo flag en 0
          stx            fire1     
          lda            #$01      
          sta            spractive ; desactivamos el sprite 1 

@next          
          rts

; -----------------------------------------------------------
; DATA  -----------------------------------------------------
; -----------------------------------------------------------
jetpac    bits           ..........BBBB..........
          bits           .........BBB............
          bits           .......B.BB.BBBB........
          bits           .......B.BBB.BBB........
          bits           .......B.BBB.BBB........
          bits           ......BB..BBBBB.........
          bits           ......BB................
          bits           ......B.B.BBBB..........
          bits           ......BBB.B..BB.B.......
          bits           ......B.B.B..BB.B.......
          bits           ......BBB.B....BBBBB....
          bits           ......B.BB.BBBB.........
          bits           ......BBBB.BBB..........
          bits           .......BBBB.BBBBBB......
          bits           .......B.B..BBBBBB......
          bits           ......B.B.B.....BB......
          bits           ......BBBBB.............
          bits           ................BBB.....
          bits           .......BB.B.....BBBB....
          bits           .......B..B.............
          bits           .....B..B...............

jetpacFire
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           B..B..BBBBBBBBBBBBBBBB.B
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................
          bits           ........................

 

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