Browse Source

Fix jumping and collisions on map boundary

master
Forest Belton 3 years ago
parent
commit
fee20378ee
2 changed files with 38 additions and 33 deletions
  1. +20
    -15
      src/collision.s
  2. +18
    -18
      src/player.s

+ 20
- 15
src/collision.s View File

@ -2,8 +2,12 @@ INCLUDE "oam.inc"
SECTION "Collision", ROM0
DEF COLLF_WALK EQU (1 << 0)
DEF COLLF_LADDER EQU (1 << 1)
DEF COLLF_PORTAL EQU (1 << 2)
; Determines if player has hit the background
; @return NZ = true, Z = false
; @return NZ = false, Z = true
player_bg_collides::
; C = MAP X = PLAYER X / 8 + CAMERA X
ld a, [PLAYER_X]
@ -15,16 +19,16 @@ player_bg_collides::
ld c, a
; C < 0
bit 7, c
ret nz
ld a, c
cpl
bit 7, a
ret z
; C >= MAP WIDTH
ld a, [CURRENT_MAP_WIDTH]
cp c
jr nz, .load_y
; Set NZ
or $ff
ret
.load_y:
@ -38,8 +42,10 @@ player_bg_collides::
ld b, a
; B < 0
bit 7, b
ret nz
ld a, b
cpl
bit 7, a
ret z
; B >= MAP HEIGHT
ld a, [CURRENT_MAP_HEIGHT]
@ -53,18 +59,18 @@ player_bg_collides::
.check_tiles:
; top left
call can_move_to
ret nz
ret z
; top right
inc c
call can_move_to
ret nz
ret z
; bottom left
dec c
inc b
call can_move_to
ret nz
ret z
; bottom right
inc c
@ -73,7 +79,7 @@ player_bg_collides::
ret
; Check if the player is in mid-air
; @note NZ = false, Z = true
; @note NZ = true, Z = false
player_in_air::
; c = x % 8 == 0 ? x/8 : x/8 + 1
ld a, [PLAYER_X]
@ -97,7 +103,7 @@ player_in_air::
inc b
call can_move_to
ret nz
ret z
inc c
call can_move_to
@ -108,7 +114,7 @@ player_in_air::
; @param b y-coordinate
; @param c x-coordinate
; @destroy a, d, e
; @note NZ = false, Z = true
; @note NZ = true, Z = false
can_move_to:
push bc
push hl
@ -129,9 +135,8 @@ can_move_to:
jr nz, .mul_y_width
add hl, bc
; check [hl] = 1
ld a, [hl]
cp 1
and COLLF_WALK
pop hl
pop bc

+ 18
- 18
src/player.s View File

@ -13,7 +13,7 @@ PLAYER_DIR:: db
PLAYER_STATE:: db
PLAYER_VY:: dw
PLAYER_INV:: DS (2 * PLAYER_INV_SIZE)
PLAYER_INV:: ds (2 * PLAYER_INV_SIZE)
Section "Player Code", ROM0
@ -62,7 +62,7 @@ Player_Update::
; initialize jump state if not already jumping
ld a, [PLAYER_STATE]
cp PLAYER_STATEF_JUMP
and PLAYER_STATEF_JUMP
jr nz, .jump_update
ld a, PLAYER_STATEF_JUMP
@ -74,7 +74,7 @@ Player_Update::
; todo: deduplicate
.jump_update_check:
ld a, [PLAYER_STATE]
cp PLAYER_STATEF_JUMP
and PLAYER_STATEF_JUMP
jr z, .right
.jump_update:
@ -92,17 +92,17 @@ Player_Update::
sbc HIGH(GRAVITY)
ld b, a
; we only need to clamp when moving down
bit 7, b
jr z, .no_clamp
; ; we only need to clamp when moving down
; bit 7, b
; jr z, .no_clamp
; vy = MIN(MAX_VY, vy)
ld a, b
cp HIGH(MAX_VY)
jr c, .no_clamp
; ; vy = MIN(MAX_VY, vy)
; ld a, b
; cp HIGH(MAX_VY)
; jr c, .no_clamp
ld b, HIGH(MAX_VY)
ld c, LOW(MAX_VY)
; ld b, HIGH(MAX_VY)
; ld c, LOW(MAX_VY)
.no_clamp:
ld hl, PLAYER_VY
@ -119,7 +119,7 @@ Player_Update::
; roll back jump if there was a collision
call player_bg_collides
jr nz, .jump_rollback
jr nz, .jump_Player_UpdateOAM
; TODO: Enable once scroll zones are implemented
; ld a, [PLAYER_VY]
@ -139,7 +139,7 @@ Player_Update::
.jump_rollback_check:
call player_bg_collides
jr nz, .jump_rollback
jr z, .jump_rollback
; set PLAYER_STATE = PLAYER_STATEF_WALK if VY < 0 (fell into ground)
ld hl, PLAYER_VY
@ -177,7 +177,7 @@ Player_Update::
ld [PLAYER_X], a
call player_bg_collides
jr nz, .right_rollback
jr z, .right_rollback
; TODO: Enable once scroll zones are implemented
; ld d, PLAYER_SPEED
@ -211,7 +211,7 @@ Player_Update::
ld [PLAYER_X], a
call player_bg_collides
jr nz, .left_rollback
jr z, .left_rollback
; TODO: Enable once scroll zones are implemented
; ld d, PLAYER_SPEED
@ -230,12 +230,12 @@ Player_Update::
.fall:
call player_in_air
ret nz
ret z
; only set jump state if not already jumping
ld hl, PLAYER_STATE
ld a, [hl]
or PLAYER_STATEF_JUMP
and PLAYER_STATEF_JUMP
ret nz
ld [hl], PLAYER_STATEF_JUMP

Loading…
Cancel
Save