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"
|
||||
|
||||
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,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,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,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
|
||||
.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
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
block_x: .res 1
|
||||
block_y: .res 1
|
||||
block_w: .res 1
|
||||
block_h: .res 1
|
||||
|
||||
metatiles:
|
||||
.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:
|
||||
.byte $0F,$00,$3D,$20 ; greyscale
|
||||
@@ -385,6 +400,7 @@ var_p: .res 1
|
||||
jump_pressed_last_frame: .res 1
|
||||
|
||||
frame_counter: .res 1
|
||||
last_frame_jumped: .res 1
|
||||
|
||||
.segment "CODE"
|
||||
main:
|
||||
@@ -405,6 +421,7 @@ main:
|
||||
|
||||
lda #0
|
||||
sta frame_counter
|
||||
sta last_frame_jumped
|
||||
|
||||
jsr init_objects
|
||||
@loop:
|
||||
@@ -526,6 +543,14 @@ init_objects:
|
||||
sta player_vel_y
|
||||
sta player_status
|
||||
|
||||
lda #64
|
||||
sta block_x
|
||||
sta block_y
|
||||
|
||||
lda #16
|
||||
sta block_w
|
||||
sta block_h
|
||||
|
||||
rts
|
||||
|
||||
draw:
|
||||
@@ -554,7 +579,7 @@ movement:
|
||||
cmp #0
|
||||
beq :+
|
||||
ldx #1
|
||||
lda #3
|
||||
lda #2
|
||||
sta player_vel_x
|
||||
|
||||
lda player_status
|
||||
@@ -566,7 +591,7 @@ movement:
|
||||
cmp #0
|
||||
beq :+
|
||||
ldx #1
|
||||
lda #253
|
||||
lda #254
|
||||
sta player_vel_x
|
||||
|
||||
lda player_status
|
||||
@@ -607,9 +632,12 @@ movement:
|
||||
beq @fail_jump ; If jump last frame, forget it
|
||||
|
||||
; Jump newly pressed this frame
|
||||
lda #250
|
||||
lda #249
|
||||
sta player_vel_y
|
||||
|
||||
lda frame_counter
|
||||
sta last_frame_jumped
|
||||
|
||||
@fail_jump:
|
||||
|
||||
jsr btn_a
|
||||
@@ -618,7 +646,9 @@ movement:
|
||||
|
||||
; Gravity
|
||||
lda frame_counter
|
||||
and #1
|
||||
sec
|
||||
sbc last_frame_jumped
|
||||
and #%00000001
|
||||
cmp #0
|
||||
bne :+
|
||||
lda player_vel_y
|
||||
@@ -633,6 +663,31 @@ movement:
|
||||
adc player_vel_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
|
||||
cmp #200
|
||||
bcc :+
|
||||
@@ -641,7 +696,6 @@ movement:
|
||||
lda #200
|
||||
sta player_pos_y
|
||||
:
|
||||
|
||||
; Bonk
|
||||
lda #8
|
||||
cmp player_pos_y
|
||||
@@ -652,13 +706,6 @@ movement:
|
||||
sta player_pos_y
|
||||
:
|
||||
|
||||
; Apply X velocity
|
||||
lda player_pos_x
|
||||
clc
|
||||
adc player_vel_x
|
||||
sta player_pos_x
|
||||
|
||||
|
||||
rts
|
||||
|
||||
update_background:
|
||||
@@ -1012,3 +1059,281 @@ btn_a:
|
||||
lsr
|
||||
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