From ab582e723c89d8d59a4f6cfdbff586f9d2616994 Mon Sep 17 00:00:00 2001 From: En Yi Date: Sun, 2 Jul 2023 21:52:19 +0800 Subject: [PATCH] Implement bomb's explosion --- scenes/editor_scene.c | 1 + scenes/ent_impl.h | 1 + scenes/game_systems.c | 21 ++++++++++++++++++++- scenes/game_systems.h | 1 + scenes/items_ent.c | 28 +++++++++++++++++++++++++++- 5 files changed, 50 insertions(+), 2 deletions(-) diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 9c5ff2e..daa0cd6 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -660,6 +660,7 @@ void init_level_scene(LevelScene_t* scene) sc_array_add(&scene->scene.systems, &state_transition_update_system); sc_array_add(&scene->scene.systems, &player_ground_air_transition_system); sc_array_add(&scene->scene.systems, &container_destroy_system); + sc_array_add(&scene->scene.systems, &lifetimer_update_system); sc_array_add(&scene->scene.systems, &sprite_animation_system); sc_array_add(&scene->scene.systems, &camera_update_system); sc_array_add(&scene->scene.systems, &player_dir_reset_system); diff --git a/scenes/ent_impl.h b/scenes/ent_impl.h index df96643..644c2de 100644 --- a/scenes/ent_impl.h +++ b/scenes/ent_impl.h @@ -18,5 +18,6 @@ Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool meta Entity_t* create_boulder(EntityManager_t* ent_manager, Assets_t* assets); Entity_t* create_arrow(EntityManager_t* ent_manager, Assets_t* assets, uint8_t dir); Entity_t* create_bomb(EntityManager_t* ent_manager, Assets_t* assets, Vector2 launch_dir); +Entity_t* create_explosion(EntityManager_t* ent_manager, Assets_t* assets); #endif // __ENT_IMPL_H diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 879b212..6e55276 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -1829,6 +1829,9 @@ void container_destroy_system(Scene_t* scene) case CONTAINER_BOMB: new_ent = create_bomb(&scene->ent_manager, &scene->engine->assets, (Vector2){0, -1}); break; + case CONTAINER_EXPLOSION: + new_ent = create_explosion(&scene->ent_manager, &scene->engine->assets); + break; default: new_ent = NULL; break; @@ -1837,12 +1840,28 @@ void container_destroy_system(Scene_t* scene) { CTransform_t* new_p_ct = get_component(new_ent, CTRANSFORM_COMP_T); CTransform_t* p_ct = get_component(p_ent, CTRANSFORM_COMP_T); - memcpy(&new_p_ct->position, &p_ct->position, sizeof(Vector2)); + new_p_ct->position = Vector2Add(new_p_ct->position, p_ct->position); } } } } +void lifetimer_update_system(Scene_t* scene) +{ + LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); + TileGrid_t tilemap = data->tilemap; + unsigned int ent_idx; + CLifeTimer_t* p_lifetimer; + sc_map_foreach(&scene->ent_manager.component_map[CLIFETIMER_T], ent_idx, p_lifetimer) + { + p_lifetimer->life_time--; + if (p_lifetimer->life_time == 0) + { + remove_entity_from_tilemap(&scene->ent_manager, &tilemap, get_entity(&scene->ent_manager, ent_idx)); + } + } +} + void sprite_animation_system(Scene_t* scene) { unsigned int ent_idx; diff --git a/scenes/game_systems.h b/scenes/game_systems.h index 88ac8d1..fb32ee5 100644 --- a/scenes/game_systems.h +++ b/scenes/game_systems.h @@ -23,6 +23,7 @@ void camera_update_system(Scene_t* scene); void container_destroy_system(Scene_t* scene); void player_dir_reset_system(Scene_t* scene); void player_respawn_system(Scene_t* scene); +void lifetimer_update_system(Scene_t* scene); void spike_collision_system(Scene_t* scene); diff --git a/scenes/items_ent.c b/scenes/items_ent.c index 34ec182..185699e 100644 --- a/scenes/items_ent.c +++ b/scenes/items_ent.c @@ -95,15 +95,41 @@ Entity_t* create_bomb(EntityManager_t* ent_manager, Assets_t* assets, Vector2 la add_component(p_bomb, CMOVEMENTSTATE_T); CHitBoxes_t* p_hitbox = add_component(p_bomb, CHITBOXES_T); p_hitbox->n_boxes = 1; - p_hitbox->boxes[0] = (Rectangle){0, 0, TILE_SIZE, TILE_SIZE}; + p_hitbox->boxes[0] = (Rectangle){0, 0, 25, 25}; p_hitbox->atk = 0; p_hitbox->one_hit = true; + CContainer_t* p_container = add_component(p_bomb, CCONTAINER_T); + p_container->item = CONTAINER_EXPLOSION; + CTransform_t* p_ctransform = add_component(p_bomb, CTRANSFORM_COMP_T); p_ctransform->active = true; p_ctransform->movement_mode = REGULAR_MOVEMENT; + p_ctransform->position.x += (TILE_SIZE - 25) / 2; + p_ctransform->position.y += (TILE_SIZE - 25) / 2; p_ctransform->velocity = Vector2Scale(Vector2Normalize(launch_dir), 500); return p_bomb; } + +Entity_t* create_explosion(EntityManager_t* ent_manager, Assets_t* assets) +{ + Entity_t* p_explosion = add_entity(ent_manager, DESTRUCTABLE_ENT_TAG); + add_component(p_explosion, CTILECOORD_COMP_T); + CHitBoxes_t* p_hitbox = add_component(p_explosion, CHITBOXES_T); + p_hitbox->n_boxes = 1; + + p_hitbox->atk = 3; + + CTransform_t* p_ctransform = add_component(p_explosion, CTRANSFORM_COMP_T); + p_ctransform->movement_mode = KINEMATIC_MOVEMENT; + p_ctransform->active = true; + p_ctransform->position.x -= 15; + p_ctransform->position.y -= 15; + p_hitbox->boxes[0] = (Rectangle){0, 0, TILE_SIZE + 30, TILE_SIZE + 30}; + + CLifeTimer_t* p_clifetimer = add_component(p_explosion, CLIFETIMER_T); + p_clifetimer->life_time = 3; + return p_explosion; +}