Implement bomb's explosion
parent
c4d8256767
commit
ab582e723c
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue