Collision detection
This commit is contained in:
BIN
background.chr
BIN
background.chr
Binary file not shown.
371
plat.s
371
plat.s
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user