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, &state_transition_update_system);
|
||||||
sc_array_add(&scene->scene.systems, &player_ground_air_transition_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, &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, &sprite_animation_system);
|
||||||
sc_array_add(&scene->scene.systems, &camera_update_system);
|
sc_array_add(&scene->scene.systems, &camera_update_system);
|
||||||
sc_array_add(&scene->scene.systems, &player_dir_reset_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_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_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_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
|
#endif // __ENT_IMPL_H
|
||||||
|
|
|
@ -1829,6 +1829,9 @@ void container_destroy_system(Scene_t* scene)
|
||||||
case CONTAINER_BOMB:
|
case CONTAINER_BOMB:
|
||||||
new_ent = create_bomb(&scene->ent_manager, &scene->engine->assets, (Vector2){0, -1});
|
new_ent = create_bomb(&scene->ent_manager, &scene->engine->assets, (Vector2){0, -1});
|
||||||
break;
|
break;
|
||||||
|
case CONTAINER_EXPLOSION:
|
||||||
|
new_ent = create_explosion(&scene->ent_manager, &scene->engine->assets);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
new_ent = NULL;
|
new_ent = NULL;
|
||||||
break;
|
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* new_p_ct = get_component(new_ent, CTRANSFORM_COMP_T);
|
||||||
CTransform_t* p_ct = get_component(p_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)
|
void sprite_animation_system(Scene_t* scene)
|
||||||
{
|
{
|
||||||
unsigned int ent_idx;
|
unsigned int ent_idx;
|
||||||
|
|
|
@ -23,6 +23,7 @@ void camera_update_system(Scene_t* scene);
|
||||||
void container_destroy_system(Scene_t* scene);
|
void container_destroy_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);
|
||||||
|
void lifetimer_update_system(Scene_t* scene);
|
||||||
void spike_collision_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);
|
add_component(p_bomb, CMOVEMENTSTATE_T);
|
||||||
CHitBoxes_t* p_hitbox = add_component(p_bomb, CHITBOXES_T);
|
CHitBoxes_t* p_hitbox = add_component(p_bomb, CHITBOXES_T);
|
||||||
p_hitbox->n_boxes = 1;
|
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->atk = 0;
|
||||||
p_hitbox->one_hit = true;
|
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);
|
CTransform_t* p_ctransform = add_component(p_bomb, CTRANSFORM_COMP_T);
|
||||||
p_ctransform->active = true;
|
p_ctransform->active = true;
|
||||||
p_ctransform->movement_mode = REGULAR_MOVEMENT;
|
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);
|
p_ctransform->velocity = Vector2Scale(Vector2Normalize(launch_dir), 500);
|
||||||
return p_bomb;
|
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