Add system to destroy one-way tile with boulder

scene_man
En Yi 2023-06-17 11:50:23 +08:00
parent 21dafd1b6d
commit fc2001e428
3 changed files with 39 additions and 0 deletions

View File

@ -425,6 +425,7 @@ void init_level_scene(LevelScene_t* scene)
sc_array_add(&scene->scene.systems, &moveable_update_system); sc_array_add(&scene->scene.systems, &moveable_update_system);
sc_array_add(&scene->scene.systems, &movement_update_system); sc_array_add(&scene->scene.systems, &movement_update_system);
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, &update_tilemap_system);
sc_array_add(&scene->scene.systems, &tile_collision_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);

View File

@ -1437,6 +1437,43 @@ void hitbox_update_system(Scene_t* scene)
} }
} }
void boulder_destroy_wooden_tile_system(Scene_t* scene)
{
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
TileGrid_t tilemap = data->tilemap;
Entity_t* p_boulder;
sc_map_foreach_value(&scene->ent_manager.entities_map[BOULDER_ENT_TAG], p_boulder)
{
const CTransform_t* p_ctransform = get_component(p_boulder, CTRANSFORM_COMP_T);
const CBBox_t* p_bbox = get_component(p_boulder, CBBOX_COMP_T);
if (p_ctransform->velocity.y <= 0) continue;
unsigned int tile_idx = get_tile_idx(
p_ctransform->position.x + p_bbox->half_size.x,
p_ctransform->position.y + p_bbox->size.y,
tilemap.width
);
unsigned int tile_x = (p_ctransform->position.x + p_bbox->half_size.x) / TILE_SIZE;
if (tilemap.tiles[tile_idx].tile_type == ONEWAY_TILE)
{
tilemap.tiles[tile_idx].tile_type = EMPTY_TILE;
tilemap.tiles[tile_idx].solid = NOT_SOLID;
if (tile_x > 0 && tilemap.tiles[tile_idx - 1].tile_type == ONEWAY_TILE)
{
tilemap.tiles[tile_idx - 1].tile_type = EMPTY_TILE;
tilemap.tiles[tile_idx - 1].solid = NOT_SOLID;
}
if (tile_x < tilemap.width && tilemap.tiles[tile_idx + 1].tile_type == ONEWAY_TILE)
{
tilemap.tiles[tile_idx + 1].tile_type = EMPTY_TILE;
tilemap.tiles[tile_idx + 1].solid = NOT_SOLID;
}
}
}
}
void sprite_animation_system(Scene_t* scene) void sprite_animation_system(Scene_t* scene)
{ {
unsigned int ent_idx; unsigned int ent_idx;

View File

@ -18,6 +18,7 @@ void state_transition_update_system(Scene_t* scene);
void update_tilemap_system(Scene_t* scene); void update_tilemap_system(Scene_t* scene);
void hitbox_update_system(Scene_t* scene); void hitbox_update_system(Scene_t* scene);
void sprite_animation_system(Scene_t* scene); void sprite_animation_system(Scene_t* scene);
void boulder_destroy_wooden_tile_system(Scene_t* scene);
void camera_update_system(Scene_t* scene); void camera_update_system(Scene_t* scene);
void player_dir_reset_system(Scene_t* scene); void player_dir_reset_system(Scene_t* scene);
void player_respawn_system(Scene_t* scene); void player_respawn_system(Scene_t* scene);