From 4414747c792fe7ebb5387873ed12b8b58e491f5d Mon Sep 17 00:00:00 2001 From: En Yi Date: Mon, 3 Jul 2023 22:57:13 +0800 Subject: [PATCH] Improve auto-crouch detection Changelog: - Move tilemap update to be at the start - This is to account for new entities being created - The post tile collision is not used for now - Change auto-crouch collision check to check for entities as well --- scenes/editor_scene.c | 3 ++- scenes/game_systems.c | 15 +++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index b21a9cf..de1cde5 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -642,6 +642,7 @@ void init_level_scene(LevelScene_t* scene) init_level_scene_data(&scene->data); // insert level scene systems + sc_array_add(&scene->scene.systems, &update_tilemap_system); sc_array_add(&scene->scene.systems, &player_movement_input_system); sc_array_add(&scene->scene.systems, &player_bbox_update_system); sc_array_add(&scene->scene.systems, &player_pushing_system); @@ -653,7 +654,7 @@ void init_level_scene(LevelScene_t* scene) sc_array_add(&scene->scene.systems, &boulder_destroy_wooden_tile_system); sc_array_add(&scene->scene.systems, &update_tilemap_system); sc_array_add(&scene->scene.systems, &tile_collision_system); - sc_array_add(&scene->scene.systems, &update_tilemap_system); + //sc_array_add(&scene->scene.systems, &update_tilemap_system); sc_array_add(&scene->scene.systems, &hitbox_update_system); sc_array_add(&scene->scene.systems, &player_crushing_system); sc_array_add(&scene->scene.systems, &spike_collision_system); diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 68859dc..f34bfbd 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -274,7 +274,7 @@ static uint8_t check_collision_line(const CollideEntity_t* ent, TileGrid_t* grid // TODO: This should be a point collision check, not an AABB check -static bool check_collision_offset( +static uint8_t check_collision_offset( Entity_t* p_ent, Vector2 pos, Vector2 bbox_sz, TileGrid_t* grid, Vector2 offset ) @@ -689,17 +689,8 @@ void player_movement_input_system(Scene_t* scene) } } - bool hit = false; - unsigned int tile_x1 = (p_ctransform->position.x) / TILE_SIZE; - unsigned int tile_x2 = (p_ctransform->position.x + p_bbox->size.x - 1) / TILE_SIZE; - unsigned int tile_y = (p_ctransform->position.y) / TILE_SIZE; - if (p_bbox->size.y < TILE_SIZE && tile_y > 0) tile_y--; // hack to detect small bbox state - - for(unsigned int tile_x = tile_x1; tile_x <= tile_x2; tile_x++) - { - hit |= tilemap.tiles[tile_y * tilemap.width + tile_x].tile_type == SOLID_TILE; - } - if (hit) + uint8_t collide_type = check_collision_offset(p_player, p_ctransform->position, p_bbox->size, &tilemap, (Vector2){0, -TILE_SIZE}); + if (collide_type == 1) { p_pstate->is_crouch |= 0b10; }