Colisiones

Hoy vamos a explicar como se detectan las colisiones utilizando el VIC II. Estuve un rato para entender como era, pero finalmente lo pude hacer.
Basicamente hay 2 formas de detectar colisiones: una es viendo si los sprites que nos interesan estan colisionando (haciendo un polling), y la otra es utilizando interrupciones. Como la segunda opcion queda fuera de mi conocimiento (de momento) voy a explicar la primera.

El código (simplificado)

detectCollision
        ; detecto que ocurrio una colision de sprites
          lda            $d019    ; Direccion que indica en bit 2 que ocurrio una colision
          and            #$04     ; MASK bit 2
          cmp            #$04     ; testeo si bit 2 esta encendido
          bne            @skipSprDetect ; si NO sigo de largo

        ; SI OCURRIO UNA COLISION
          lda            $d01e    ; Direccion que indica cuales colisionaron 
          and            #JP2 + FJP1 ; mascara con los que quiero testear (2 + 4 = 6)
          cmp            #JP2 + FJP1 ; testeo si estan encendidos los 2
          bne            @skipSprDetect  ; si no, que siga de largo

        ; SI LLEGA ACA = COLISIONARON DISPARO jugador 1  CONTRA jugador 2
          ; aca hago todo lo que quiera: incremento puntaje, 
          ; resto energia... 
          ; animo el sprite impactado... 

          jmp            @skipSprDetect

@skipSprDetect
          rts

Vamos a trabajar con 2 registros: $d019, que indica que ocurrio una colision sprite-sprite, y $d01e, que indica cuales colisionaron.
Aca el tema es que, cuando quise fijarme directamente en la direccion $d01e (registro de colision de sprites-sprites), no funcionaba. Eso ocurria porque ese registro se llena cuando ocurre una colision, y eso hay que detectarlo con el registro $d019, concretamente el bit 2. Si tenemos colision, entonces RECIEN podemos ver cuales colisionaron.
Un detalle que lei en la documentacion es que el registro se limpia cuando se lee… o sea, que si queremos chequear varios sprites tenemos que cargar el valor del registro y guardalo de alguna forma (ya sea en memoria, en el stack… donde se nos ocurra).

El codigo simplificado esta comentado, se entiende muy facil, NO ES EL CODIGO final que subi al repositorio, ya que ese codigo hace varias cositas mas:

  • detecta colisiones fire1 y spr2
  • fire2 y spr1
  • registra el impacto en un contador
  • muestra la cantidad de hits de ambos players
  • hace una pequeña animacion…

Pero como tengo idea de implementar maquinas de estado en ambos players (mas adelante explico que es), decidi explicar mas teoricamente esto de las colisiones, y luego de hacer las maquinas de estado poner todo mas completo.

A partir de ahora no voy a poner tanto codigo ya que ademas de codigo nuevo voy corrigiendo el codigo que escribi previamente, o hago alguna modificacion de ultimo momento, asi que prefiero explicar lo que hice, tratando de entenderlo uds y yo, y pueden ir bajando desde Github lo que tengo realizado hasta el momento:
https://github.com/moonorongo/jp_wars.git

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