diff --git a/engine/collisions.c b/engine/collisions.c index 75d12e6..8f00151 100644 --- a/engine/collisions.c +++ b/engine/collisions.c @@ -155,18 +155,17 @@ uint8_t check_collision_line(const CollideEntity_t* ent, TileGrid_t* grid, bool } // TODO: This should be a point collision check, not an AABB check -uint8_t check_collision_offset(Entity_t* p_ent, Vector2 pos, Vector2 bbox_sz, TileGrid_t* grid, Vector2 offset) +uint8_t check_collision_at(Entity_t* p_ent, Vector2 pos, Vector2 bbox_sz, TileGrid_t* grid) { - Vector2 new_pos = Vector2Add(pos, offset); CollideEntity_t ent = { .p_ent = p_ent, - .bbox = (Rectangle){new_pos.x, new_pos.y, bbox_sz.x, bbox_sz.y}, + .bbox = (Rectangle){pos.x, pos.y, bbox_sz.x, bbox_sz.y}, .prev_bbox = (Rectangle){pos.x, pos.y, bbox_sz.x, bbox_sz.y}, .area = (TileArea_t){ - .tile_x1 = (new_pos.x) / grid->tile_size, - .tile_y1 = (new_pos.y) / grid->tile_size, - .tile_x2 = (new_pos.x + bbox_sz.x - 1) / grid->tile_size, - .tile_y2 = (new_pos.y + bbox_sz.y - 1) / grid->tile_size + .tile_x1 = (pos.x) / grid->tile_size, + .tile_y1 = (pos.y) / grid->tile_size, + .tile_x2 = (pos.x + bbox_sz.x - 1) / grid->tile_size, + .tile_y2 = (pos.y + bbox_sz.y - 1) / grid->tile_size } }; diff --git a/engine/collisions.h b/engine/collisions.h index f8629f8..189c7a0 100644 --- a/engine/collisions.h +++ b/engine/collisions.h @@ -59,7 +59,7 @@ typedef struct CollideEntity { void remove_entity_from_tilemap(EntityManager_t *p_manager, TileGrid_t* tilemap, Entity_t* p_ent); uint8_t check_collision(const CollideEntity_t* ent, TileGrid_t* grid, bool check_oneway); uint8_t check_collision_line(const CollideEntity_t* ent, TileGrid_t* grid, bool check_oneway); -uint8_t check_collision_offset(Entity_t* p_ent, Vector2 pos, Vector2 bbox_sz, TileGrid_t* grid, Vector2 offset); +uint8_t check_collision_at(Entity_t* p_ent, Vector2 pos, Vector2 bbox_sz, TileGrid_t* grid); bool check_on_ground(Entity_t* p_ent, Vector2 prev_pos, Vector2 bbox_sz, TileGrid_t* grid); uint8_t check_bbox_edges(TileGrid_t* tilemap, Entity_t* p_ent, Vector2 bbox, bool ignore_fragile); #endif // __COLLISION_FUNCS_H diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 7dca325..6ff436a 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -134,7 +134,7 @@ static bool check_collision_and_move( Vector2 point_to_test = {0}; point_to_test.x = ent->position.x; point_to_test.y = other_pos->y - p_bbox->size.y + 1; - if (!check_collision_offset(ent, point_to_test, p_bbox->size, tilemap, (Vector2){0})) + if (!check_collision_at(ent, point_to_test, p_bbox->size, tilemap)) { ent->position = point_to_test; goto collision_end; @@ -142,7 +142,7 @@ static bool check_collision_and_move( point_to_test.x = other_pos->x - p_bbox->size.x + 1; point_to_test.y = ent->position.y; - if (!check_collision_offset(ent, point_to_test, p_bbox->size, tilemap, (Vector2){0})) + if (!check_collision_at(ent, point_to_test, p_bbox->size, tilemap)) { ent->position = point_to_test; goto collision_end; @@ -150,7 +150,7 @@ static bool check_collision_and_move( point_to_test.x = other_pos->x + other_bbox.x - 1; point_to_test.y = ent->position.y; - if (!check_collision_offset(ent, point_to_test, p_bbox->size, tilemap, (Vector2){0})) + if (!check_collision_at(ent, point_to_test, p_bbox->size, tilemap)) { ent->position = point_to_test; goto collision_end; @@ -158,7 +158,7 @@ static bool check_collision_and_move( point_to_test.x = ent->position.x; point_to_test.y = other_pos->y + other_bbox.y - 1; - if (!check_collision_offset(ent, point_to_test, p_bbox->size, tilemap, (Vector2){0})) + if (!check_collision_at(ent, point_to_test, p_bbox->size, tilemap)) { ent->position = point_to_test; goto collision_end; @@ -465,9 +465,12 @@ void player_movement_input_system(Scene_t* scene) } } - uint8_t collide_type = check_collision_offset( - p_player, p_player->position, p_bbox->size, - &tilemap, (Vector2){0, p_bbox->size.y - PLAYER_HEIGHT} + Vector2 point_to_check = Vector2Add( + p_player->position, + (Vector2){0, p_bbox->size.y - PLAYER_HEIGHT} + ); + uint8_t collide_type = check_collision_at( + p_player, point_to_check, p_bbox->size, &tilemap ); if (collide_type == 1) { @@ -561,10 +564,10 @@ void player_bbox_update_system(Scene_t* scene) } } + Vector2 point_to_check = Vector2Add(p_player->position, offset); if ( - check_collision_offset( - p_player, p_player->position, new_bbox, - &tilemap, offset + check_collision_at( + p_player, point_to_check, new_bbox, &tilemap ) != 1 ) {