From 7137a77811c1acaa9a44d217da69a71124191263 Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Mon, 22 Sep 2025 20:33:37 +0200 Subject: [PATCH] collision: wip actor -> rectangle collision --- src/actor.s | 42 ++++++++++++++++++++++++++++-------------- src/rectangle.s | 19 ++++++++++++++++--- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/actor.s b/src/actor.s index 9451f69..f64611c 100644 --- a/src/actor.s +++ b/src/actor.s @@ -148,6 +148,30 @@ actor_write_default_collider: ld [hl+], a ; width ret + ; performs a single test case + ; inputs: + ; tmp_rect: new target rect + ; $1: rect_bl/tl/br/tr call + ; hl: rectangle to compare to + ; preserves all registers + ; jumps to $2 on collision +#macro actor_test_movement_corner + push_all + + 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 + cp a, 1 + jp z, $2 + + pop_all +#endmacro + ; tests movement against all collision rectangles ; inputs: ; a: collision mask @@ -170,21 +194,11 @@ actor_test_movement: jp z, @skip_rect ; test all corners of tmp_rect - push_all - - push hl - ld hl, tmp_rect - call rect_bl ; bc = bottom left point - push de - pop bc - pop hl ; hl = test rect - - call rect_point_test - cp a, 1 - jp z, @rect_collision - - pop_all + 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 @skip_rect: add hl, de ; next rect (de = r_size) dec b diff --git a/src/rectangle.s b/src/rectangle.s index 6e44b1b..1ccb4d3 100644 --- a/src/rectangle.s +++ b/src/rectangle.s @@ -162,10 +162,10 @@ rect_point_test: ld a, b ; compare y points cp a, d - jp nc, @no_collision + jp c, @no_collision ld a, c ; compare x position cp a, e - jp nc, @no_collision + jp c, @no_collision ; bottom left push hl @@ -174,7 +174,7 @@ rect_point_test: ld a, b ; compare y cp a, d - jp c, @no_collision + jp nc, @no_collision ld a, c ; compare x cp a, e jp c, @no_collision @@ -184,14 +184,27 @@ rect_point_test: call rect_tr pop hl + ld a, b ; compare y + cp a, d + jp c, @no_collision + ld a, c ; compare x position + cp a, e + jp nc, @no_collision + ; bottom right push hl call rect_br pop hl + ld a, b ; compare y + jp c, @no_collision + ld a, c ; compare x + cp a, e + jp nc, @no_collision @collision: + BREAK ld a, 1 ret @no_collision: -- 2.30.2