From: Lukas Krickl Date: Fri, 26 Sep 2025 08:11:11 +0000 (+0200) Subject: actor: collision now uses pre-computed points for the source rectangle X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=7ac9179a5a808364ec7cc8e03e3d45b41aad4e68;p=gbrg%2F.git actor: collision now uses pre-computed points for the source rectangle --- diff --git a/src/actor.s b/src/actor.s index aa7fad3..e13760a 100644 --- a/src/actor.s +++ b/src/actor.s @@ -173,25 +173,29 @@ actor_write_default_collider: ; performs a single test case ; inputs: ; tmp_rect: new target rect + ; de: ptr to 2 coordinates (y/x) e.g. tmp_rect_points ; $1: rect_bl/tl/br/tr call ; hl: rectangle to compare to - ; preserves all registers - ; jumps to $2 on collision + ; jumps to $1 on collision + ; returns: + ; de: de+=2 + ; preserves: hl #macro actor_test_movement_corner - push_all - + ld a, [de] + inc de + ld b, a + ld a, [de] + inc de + ld c, a + ; bc = point + push hl - ld hl, tmp_rect - call $1 ; bc = bottom left point push de - pop bc - pop hl ; hl = test rect - call rect_point_test + pop de + pop hl cp a, 1 - jp z, $2 - - pop_all + jp z, $1 #endmacro ; tests movement against all collision rectangles @@ -341,62 +345,34 @@ actor_test_movement_write_points: ; tmp_act_direction: direction ; tmp_rect: new collision rectangle ; tmp_rect_mask: mask to test agains + ; tmp_rect_points: 2 rectangle points base don tmp_rect and the + ; chosen direction ; hl: rectangle to test ; returns: ; a: 1 collision ; a: 0 no collision + ; preserves: all registers actor_test_rect: + push_all + ; pre-filter rectangle mask ld a, [tmp_rect_mask] call rect_test_mask - ret z + jp z, @no_collision - ld a, [tmp_act_direction] - cp a, DIRUP - jp z, @up - cp a, DIRDOWN - jp z, @down - cp a, DIRLEFT - jp z, @left - cp a, DIRRIGHT - jp z, @right - - ; default: test all corners of tmp_rect - - actor_test_movement_corner rect_bl, @rect_collision - actor_test_movement_corner rect_br, @rect_collision - actor_test_movement_corner rect_tl, @rect_collision - actor_test_movement_corner rect_tr, @rect_collision + ; test the first 2 points in tmp_rect_points + ld de, tmp_rect_points + actor_test_movement_corner @rect_collision + actor_test_movement_corner @rect_collision @no_collision: + pop_all xor a, a ret @rect_collision: - ; actor_test_movement does not pop all when the check - ; passes pop_all ld a, 1 ret -@up: - actor_test_movement_corner rect_tl, @rect_collision - actor_test_movement_corner rect_tr, @rect_collision - xor a, a - ret -@down: - actor_test_movement_corner rect_bl, @rect_collision - actor_test_movement_corner rect_br, @rect_collision - xor a, a - ret -@right: - actor_test_movement_corner rect_br, @rect_collision - actor_test_movement_corner rect_tr, @rect_collision - xor a, a - ret -@left: - actor_test_movement_corner rect_bl, @rect_collision - actor_test_movement_corner rect_tl, @rect_collision - xor a, a - ret ; calls collision resolution ; inputs: diff --git a/src/wram.s b/src/wram.s index 5ba82e9..048107a 100644 --- a/src/wram.s +++ b/src/wram.s @@ -87,7 +87,7 @@ tmp_rect_mask: .adv 1 ; temporary points ; has enough space for 4 points ; store pre-calculated points here for collision checking -tmp_rect_points: .adv 4 * 2 +tmp_rect_points: .adv 8 ; temporary actor direction mask tmp_act_direction: .adv 1