Implement bomb's explosion

scene_man
En Yi 2023-07-02 21:52:19 +08:00
parent c4d8256767
commit ab582e723c
5 changed files with 50 additions and 2 deletions

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;
}