From 673c84b1e56f65bcda448b2304e98ff4831100fd Mon Sep 17 00:00:00 2001 From: Xander Swan Date: Tue, 23 Dec 2025 21:17:29 -0500 Subject: Move physics objects between bins correctly --- src/main.odin | 2 +- src/phys/world.odin | 8 +++++--- src/player.odin | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main.odin b/src/main.odin index 6b04e02..88bf953 100644 --- a/src/main.odin +++ b/src/main.odin @@ -107,7 +107,7 @@ frame :: proc() { } cleanup :: proc() { - delete_player(&state.player) + delete_player(state.player) delete_entity_list(state.platform_list) tiled.delete_map(state.room) phys.destroy_world() diff --git a/src/phys/world.odin b/src/phys/world.odin index 66479e8..0f03de7 100644 --- a/src/phys/world.odin +++ b/src/phys/world.odin @@ -72,13 +72,14 @@ add_to_bins :: proc(b: Body) { bin := find_bin(b) idx := i32(len(bin)) append(bin, b.handle) - world.bodies[bin[idx]].bin_idx = idx + world.bodies[b.handle].bin_idx = idx } @(private="file") remove_from_bins :: proc(b: Body) { bin := find_bin(b) + assert(len(bin) > 0) assert(bin[b.bin_idx] == b.handle) last := pop(bin) @@ -194,14 +195,15 @@ update_body :: proc(h: Body_Handle) { b.vel.y = 0 } - b.pos = res_pos - prev_bin := hash_bin(world_to_bin(b.pos + b.rect.start)) res_bin := hash_bin(world_to_bin(res_pos + b.rect.start)) if prev_bin != res_bin { remove_from_bins(b^) + b.pos = res_pos add_to_bins(b^) + } else { + b.pos = res_pos } } diff --git a/src/player.odin b/src/player.odin index 80672a9..65e1b87 100644 --- a/src/player.odin +++ b/src/player.odin @@ -47,7 +47,7 @@ init_player :: proc(p: ^Player) { } } -delete_player :: proc(p: ^Player) { +delete_player :: proc(p: Player) { phys.remove_body(p.body_handle) draw.destroy_sprite(p.sprite) -- cgit v1.3-2-g0d8e