Add player collision with spikes
parent
451b241460
commit
2b878ae784
|
@ -478,6 +478,7 @@ void init_level_scene(LevelScene_t* scene)
|
|||
sc_array_add(&scene->scene.systems, &update_tilemap_system);
|
||||
sc_array_add(&scene->scene.systems, &hitbox_update_system);
|
||||
sc_array_add(&scene->scene.systems, &player_crushing_system);
|
||||
sc_array_add(&scene->scene.systems, &player_spike_collision_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, &sprite_animation_system);
|
||||
|
|
|
@ -697,6 +697,45 @@ void player_crushing_system(Scene_t* scene)
|
|||
}
|
||||
}
|
||||
|
||||
void player_spike_collision_system(Scene_t* scene)
|
||||
{
|
||||
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
|
||||
TileGrid_t tilemap = data->tilemap;
|
||||
Entity_t* p_player;
|
||||
sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_player)
|
||||
{
|
||||
CTransform_t* p_ctransform = get_component(p_player, CTRANSFORM_COMP_T);
|
||||
CBBox_t* p_bbox = get_component(p_player, CBBOX_COMP_T);
|
||||
unsigned int tile_x1 = (p_ctransform->position.x) / TILE_SIZE;
|
||||
unsigned int tile_y1 = (p_ctransform->position.y) / TILE_SIZE;
|
||||
unsigned int tile_x2 = (p_ctransform->position.x + p_bbox->size.x - 1) / TILE_SIZE;
|
||||
unsigned int tile_y2 = (p_ctransform->position.y + p_bbox->size.y - 1) / TILE_SIZE;
|
||||
Vector2 overlap;
|
||||
for (unsigned int tile_y = tile_y1; tile_y <= tile_y2; tile_y++)
|
||||
{
|
||||
for (unsigned int tile_x = tile_x1; tile_x <= tile_x2; tile_x++)
|
||||
{
|
||||
unsigned int tile_idx = tile_y * tilemap.width + tile_x;
|
||||
if(tilemap.tiles[tile_idx].tile_type == SPIKES)
|
||||
{
|
||||
if (find_AABB_overlap(
|
||||
p_ctransform->position, p_bbox->size,
|
||||
(Vector2){
|
||||
tile_x * TILE_SIZE + tilemap.tiles[tile_idx].offset.x,
|
||||
tile_y * TILE_SIZE + tilemap.tiles[tile_idx].offset.y
|
||||
},
|
||||
tilemap.tiles[tile_idx].size,
|
||||
&overlap))
|
||||
{
|
||||
p_player->m_alive = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void tile_collision_system(Scene_t* scene)
|
||||
{
|
||||
static bool checked_entities[MAX_COMP_POOL_SIZE] = {0};
|
||||
|
|
|
@ -22,4 +22,5 @@ void boulder_destroy_wooden_tile_system(Scene_t* scene);
|
|||
void camera_update_system(Scene_t* scene);
|
||||
void player_dir_reset_system(Scene_t* scene);
|
||||
void player_respawn_system(Scene_t* scene);
|
||||
void player_spike_collision_system(Scene_t* scene);
|
||||
#endif // __GAME_SYSTEMS_H
|
||||
|
|
Loading…
Reference in New Issue