Collision detection

This commit is contained in:
RochesterX
2026-02-17 22:52:47 -05:00
parent fbfc6401ec
commit 0100b05291
3 changed files with 348 additions and 23 deletions

Binary file not shown.

BIN
plat.nes

Binary file not shown.

371
plat.s
View File

@@ -327,25 +327,40 @@ gamepad_poll:
.segment "RODATA" .segment "RODATA"
level: level:
.byte 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1
.byte 0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1
.byte 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1
.byte 0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1
.byte 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,1,0,0,1,0,0,0,0,1,0,0,2,7,7,3
.byte 0,0,0,0,0,0,0,0,0,1,0,0,6,0,0,9
.byte 0,1,0,0,1,0,0,0,0,1,0,0,6,0,0,9
.byte 0,0,1,1,0,0,0,0,0,1,0,0,4,8,8,5
.byte 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0 .byte 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0
.byte 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0
.byte 0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0
.byte 0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0
.byte 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0
.byte 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0 block_x: .res 1
.byte 0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0 block_y: .res 1
.byte 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0 block_w: .res 1
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 block_h: .res 1
metatiles: metatiles:
.byte 0,0,0,0,0 .byte 0,0,0,0,0
.byte 3,4,5,6,1 .byte $14,$15,$16,$17,1 ; Full block
.byte $14,$18,$1B,$0,1 ; up / left
.byte $18,$15,$0,$19,1 ; up / right
.byte $1B,$0,$16,$1A,1 ; down / left
.byte $0,$19,$1A,$17,1 ; down / right
.byte $1B,$0,$1B,$0,1 ; left
.byte $18,$18,$0,$0,1 ; up
.byte $0,$0,$1A,$1A,1 ; down
.byte $0,$19,$0,$19,1 ; right
.byte 3,3,3,3,0
.byte 3,4,5,6,0
example_palette: example_palette:
.byte $0F,$00,$3D,$20 ; greyscale .byte $0F,$00,$3D,$20 ; greyscale
@@ -385,6 +400,7 @@ var_p: .res 1
jump_pressed_last_frame: .res 1 jump_pressed_last_frame: .res 1
frame_counter: .res 1 frame_counter: .res 1
last_frame_jumped: .res 1
.segment "CODE" .segment "CODE"
main: main:
@@ -405,6 +421,7 @@ main:
lda #0 lda #0
sta frame_counter sta frame_counter
sta last_frame_jumped
jsr init_objects jsr init_objects
@loop: @loop:
@@ -526,6 +543,14 @@ init_objects:
sta player_vel_y sta player_vel_y
sta player_status sta player_status
lda #64
sta block_x
sta block_y
lda #16
sta block_w
sta block_h
rts rts
draw: draw:
@@ -554,7 +579,7 @@ movement:
cmp #0 cmp #0
beq :+ beq :+
ldx #1 ldx #1
lda #3 lda #2
sta player_vel_x sta player_vel_x
lda player_status lda player_status
@@ -566,7 +591,7 @@ movement:
cmp #0 cmp #0
beq :+ beq :+
ldx #1 ldx #1
lda #253 lda #254
sta player_vel_x sta player_vel_x
lda player_status lda player_status
@@ -607,9 +632,12 @@ movement:
beq @fail_jump ; If jump last frame, forget it beq @fail_jump ; If jump last frame, forget it
; Jump newly pressed this frame ; Jump newly pressed this frame
lda #250 lda #249
sta player_vel_y sta player_vel_y
lda frame_counter
sta last_frame_jumped
@fail_jump: @fail_jump:
jsr btn_a jsr btn_a
@@ -618,7 +646,9 @@ movement:
; Gravity ; Gravity
lda frame_counter lda frame_counter
and #1 sec
sbc last_frame_jumped
and #%00000001
cmp #0 cmp #0
bne :+ bne :+
lda player_vel_y lda player_vel_y
@@ -633,6 +663,31 @@ movement:
adc player_vel_y adc player_vel_y
sta player_pos_y sta player_pos_y
; Apply X velocity
lda player_pos_x
clc
adc player_vel_x
sta player_pos_x
; load x pos, filter blocks, check up and down
lda player_vel_y
cmp #0
bmi :+ ; branch if moving up
jsr downward_collision_check
jsr left_collision_check
jsr right_collision_check
jsr upward_collision_check
jmp :++
:
jsr upward_collision_check
jsr left_collision_check
jsr right_collision_check
jsr downward_collision_check
:
rts
; Keep grounded ; Keep grounded
cmp #200 cmp #200
bcc :+ bcc :+
@@ -641,7 +696,6 @@ movement:
lda #200 lda #200
sta player_pos_y sta player_pos_y
: :
; Bonk ; Bonk
lda #8 lda #8
cmp player_pos_y cmp player_pos_y
@@ -652,13 +706,6 @@ movement:
sta player_pos_y sta player_pos_y
: :
; Apply X velocity
lda player_pos_x
clc
adc player_vel_x
sta player_pos_x
rts rts
update_background: update_background:
@@ -1012,3 +1059,281 @@ btn_a:
lsr lsr
rts rts
downward_collision_check:
lda #0
sta var_n
@begin_check:
lda player_pos_x
ldx var_n
cpx #0
bne :+
sec
sbc #6
jmp :++
:
clc
adc #5
:
; divide by 16
clc
ror
clc
ror
clc
ror
clc
ror
sta temp_x
lda player_pos_y
; divide by 16
clc
adc #8
clc
ror
clc
ror
clc
ror
clc
ror
tay
lda #16
jsr mul_y
adc temp_x
tax
lda level, X
cmp #0
beq :+
tya
asl
asl
asl
asl
sec
sbc #8
cmp player_pos_y
bcs :+
sta player_pos_y
lda #0
sta player_vel_y
:
ldx var_n
inx
stx var_n
cpx #1
beq @begin_check
rts
upward_collision_check:
lda #0
sta var_n
@begin_check:
lda player_pos_x
ldx var_n
cpx #0
bne :+
sec
sbc #6
jmp :++
:
clc
adc #5
:
; divide by 16
clc
ror
clc
ror
clc
ror
clc
ror
sta temp_x
lda player_pos_y
; divide by 16
sec
sbc #8
clc
ror
clc
ror
clc
ror
clc
ror
tay
lda #16
jsr mul_y
adc temp_x
tax
lda level, X
cmp #0
beq :+
iny
tya
asl
asl
asl
asl
clc
adc #8
cmp player_pos_y
bcc :+
sta player_pos_y
lda #0
sta player_vel_y
:
ldx var_n
inx
stx var_n
cpx #1
beq @begin_check
rts
right_collision_check:
lda #0
sta var_n
@begin_check:
lda player_pos_x
; divide by 16
clc
adc #8
clc
ror
clc
ror
clc
ror
clc
ror
sta temp_x
lda player_pos_y
ldx var_n
cpx #0
bne :+
sec
sbc #7
jmp :++
:
clc
adc #6
:
; divide by 16
clc
ror
clc
ror
clc
ror
clc
ror
tay
lda #16
jsr mul_y
adc temp_x
tax
lda level, X
cmp #0
beq :+
lda temp_x
asl
asl
asl
asl
sec
sbc #8
cmp player_pos_x
bcs :+
sta player_pos_x
lda #0
sta player_vel_x
:
ldx var_n
inx
stx var_n
cpx #1
beq @begin_check
rts
left_collision_check:
lda #0
sta var_n
@begin_check:
lda player_pos_x
; divide by 16
sec
sbc #8
clc
ror
clc
ror
clc
ror
clc
ror
sta temp_x
lda player_pos_y
ldx var_n
cpx #0
bne :+
sec
sbc #7
jmp :++
:
clc
adc #6
:
; divide by 16
clc
ror
clc
ror
clc
ror
clc
ror
tay
lda #16
jsr mul_y
adc temp_x
tax
lda level, X
cmp #0
beq :+
lda temp_x
clc
adc #1
asl
asl
asl
asl
clc
adc #8
cmp player_pos_x
bcc :+
sta player_pos_x
lda #0
sta player_vel_x
:
ldx var_n
inx
stx var_n
cpx #1
beq @begin_check
rts