collision: wip actor -> rectangle collision
authorLukas Krickl <lukas@krickl.dev>
Mon, 22 Sep 2025 18:33:37 +0000 (20:33 +0200)
committerLukas Krickl <lukas@krickl.dev>
Mon, 22 Sep 2025 18:33:37 +0000 (20:33 +0200)
src/actor.s
src/rectangle.s

index 9451f69a83a2bf5d266892d7698914d5d201b6e2..f64611ce13aae2ee52f51d9c61908ddcebdc8a69 100644 (file)
@@ -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
index 6e44b1b3da4730cbd9dc3b63965c2d3da18f16b2..1ccb4d36289118f9190147e2c4eb0d507b93fb4b 100644 (file)
@@ -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: