Buenas gente, había leído sobre este asunto en los foros y hasta ahora no le había dado importancia porque no me he encontrado con este problema, pero en lo que estoy trabando ahora las colisiones por hard no funcionaban de manera precisa, la rutina que funcionaba hasta ahora, aquí se comía la mitad de las colisiones de una manera inaceptable. Dando un vistazo por Codebase64 empiezo a encontrar muchos apuntes a las colisiones por soft para solventarlo, comentando para mi sorpresa que cuando hay que controlar muchas cosas a la vez en pantalla, el registro de colisiones ya no es el adecuado para controlarlo.
Aquí aparece la idea de colisiones por soft, se trata de determinar las cuatro esquinas que conforman el sprite y comprobar si las coordenadas del interior de este rectángulo coincide con las coordenadas de otro sprite determinado del mismo modo.
Como me ha costado unos cuantos días pelearme con esto, aquí os paso mi primera aproximación a la solución del problema, creo que cualquiera que desarrolle se encontrará con esto en algún momento.
Saludos!
; 10 SYS (2064)
v=$d000 ;inicio registros sprite
*=$0801
BYTE $0E, $08, $0A, $00, $9E, $20, $28, $32, $30, $36, $34, $29, $00, $00, $00
*=$0810
jsr sprite
l jsr raster_wait
jsr JOY
jmp l
sprite lda #3 ;pon 2 sprites en pantalla
sta v+21
lda #0
sta v+39
lda #3
sta v+40
lda #192
sta 2040
lda #193
sta 2041
lda #100
sta v
lda #190
sta v+2
lda #147
sta v+1
sta v+3
rts
raster_wait ;espera línea raster
l1 LDA #$EA
CMP $D012
BNE l1
BIT $d011
BMI l1
rts
JOY LDA $DC00 ;LEEMOS JOY
AND #31 ;LA CUATRO DIRECCIONES ARRIBA ABAJO IZQ DER
CMP #30
BEQ ARR
CMP #29
BEQ ABJ
CMP #27
BEQ IZQ
CMP #23
BEQ DER
rts
arr dec $d001
jsr coordenadas
jsr comprueba_col
rts
abj inc $d001
jsr coordenadas
jsr comprueba_col
rts
izq dec $d000
jsr coordenadas
jsr comprueba_col
rts
der inc $d000
jsr coordenadas
jsr comprueba_col
rts
coordenadas ;actualiza coordenadas de los 2 sprites
lda v ;y crea 4 variables con las 4 esquinas
sta s1x1 ;de los sprites
clc ;s1x1 sprite 1 x1
adc #23 ;s1x2 sprite 1 x2
sta s1x2 ;etc....
lda v+1
sta s1y1
clc
adc #20
sta s1y2
lda v+2
sta s2x1
clc
adc #23
sta s2x2
lda v+3
sta s2y1
clc
adc #20
sta s2y2
rts
s1x1 byte 0
s1x2 byte 0
s1y1 byte 0
s1y2 byte 0
s2x1 byte 0
s2x2 byte 0
s2y1 byte 0
s2y2 byte 0
comprueba_col ;comprueba colisión en base a las coordenadas
lda s1x2 ;si se cumplen incrementa color borde
cmp s2x1
bcs comprueba_col1
rts
comprueba_col1
lda s1x1
cmp s2x2
bcc comprueba_col2
rts
comprueba_col2
lda s1y2
cmp s2y1
bcs comprueba_col3
rts
comprueba_col3
lda s1y1
cmp s2y2
bcc hit
rts
hit inc $d020
rts
*=12288
incbin"prueba.bin"