Animaciones – explosiones

En esta entada voy a explicar como agregar una animacion para cuando el jugador es impactado por un laser.
Inicialmente haciamos algo tan sencillo como incrementar o decrementar la posicion del jugador impactado por 3 pixeles, luego lo mejoramos con una caida ‘catastrofica’ cuando implementamos la maquina de estados, y ahora le pondremos una animacion.
Para que la animacion no pase tan rapido agregue un bloque de codigo que genera un ‘tick’ cada 4 frames, que lo usaremos para avanzar un frame de la animacion.

Primero, un vistazo y explicacion al codigo del ‘Tick Generator’ (seguramente, cuando mas adelante necesitemos otros intervalos los agregaremos aqui)


tickGenerator          
    lda     internalCounter   ; direccion contador interno programa
                              ; se incrementa en cada ciclo
    and     #4                ; si el bit 2 esta activado 
    sta     tick4             ; guardo tick4 anterior 
                              ; usando la direccion tick4 como temporal          
    inc     internalCounter

    lda     internalCounter   
    and     #4         
    cmp     tick4             ; comparo con nuevo tick4
                              ; si es distinto hay un cambio de estado
    bne     @setTick4_1       ; entonces genero un 'tick'          

    ldx     #0
    stx     tick4             ; si no pongo tick4 en 0

    jmp     @skip     
    
@setTick4_1
    ldx     #1  
    stx     tick4 
    
@skip
    rts

El funcionamiento del generador de ticks es muy sencillo, simplemente tenemos una direccion de memoria llamada internalCounter, que la incrementamos en cada loop, y que haciendo diferentes AND’s (1,2,4,8,16,32,64,128) podemos generar una suerte de mensajes cada 1, 2, 4… 128 frames (cada loop es un frame).

Con el generador de ticks podemos explicar el siguiente codigo, que corresponde al STATUS_3:


@statusJP_3                    ; --------------- STATUS 3 -----
    ldx    gravityCounter      ; Bloque controlador de gravedad  
    dex                        ; si no pongo esto
    stx    gravityCounter      ; la animacion pasa muy rapido
    cpx    #$0                 ; quiza a la brevedad 
    bne    @exit               ; lo meta en una subrutina
    ldx    #gravity
    stx    gravityCounter
                               ; fin bloque controlador gravedad
                               
    lda    tick4               ; me fijo si hay un tick4
    cmp    #0                  ; si no hay tick
    beq    @skipIncFallCounter ; sigo de largo
                               ; si hay tick4 (c/4 frames)
    inc    fallCounter         ; incremento fallCounter 
         
@skipIncFallCounter          
    lda    spry                ; en A cargo posicion Y de JP
    adc    fallCounter         ; sumo fallCounter 
    sta    spry                ; y actualizo

    ldx    fallCounter    ; tambien voy a usar fallCounter
    dex                   ; como contador de frames (0 a 4)
    cpx    #4             ; hasta que llegue a 4 
    beq    @explodeEnded  ; si es igual, que no asigne ningun frame mas

    txa                   ; transfiero x -> a
    adc    #ptrJPExplode  ; lo sumo a primer ptr explosion
    sta    sprpoint       ; lo asigno al ptr de JP
         
@explodeEnded          
                        ; controlo si decremento pos X de JP
                        ; segun para donde esta mirando el otro
    ldx    sprpoint2    ; (si recibe el tiro de frente o detras)
    cpx    #ptrJPRight  ; si esta mirando a la derecha
    bne    @decxspr2    ; va a decrementa sprx

    ldx    sprx       
    inx              ; si mira a la izq incrementa
    stx    sprx      
    jmp    @chkFloor  
         
@decxspr2
    ldx    sprx      
    dex              ; decrementa si mira a la derecha
    stx    sprx      


@chkFloor
    jsr    checkFloorP1  ; compara si llego al piso
    cpx    #1            
    bne    @exit         ; si no, sigue

    ldx    #0            ; si llego al piso 
    stx    fallCounter   ; inicializa fallCounter

    ldx    #0            ; cambia STATUS a 0 
    stx    statusJP1 

@exit                             
    rts

y finalmente, un video con el resultado final:

Como siempre, el codigo completo lo pueden bajar desde el repositorio:
https://github.com/moonorongo/jp_wars.git

Ademas: el compilado para descargar: link
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