Compare commits
No commits in common. "066ea5e08001a87cd1e740d67e38d745ceb3761a" and "c8059300ace55e441251d4624fcd19b007078d75" have entirely different histories.
066ea5e080
...
c8059300ac
|
@ -1413,7 +1413,7 @@ void init_sandbox_scene(LevelScene_t* scene)
|
|||
sc_array_add(&scene->scene.systems, &hitbox_update_system);
|
||||
sc_array_add(&scene->scene.systems, &player_crushing_system);
|
||||
sc_array_add(&scene->scene.systems, &spike_collision_system);
|
||||
//sc_array_add(&scene->scene.systems, &edge_velocity_check_system);
|
||||
sc_array_add(&scene->scene.systems, &edge_velocity_check_system);
|
||||
sc_array_add(&scene->scene.systems, &state_transition_update_system);
|
||||
sc_array_add(&scene->scene.systems, &update_entity_emitter_system);
|
||||
sc_array_add(&scene->scene.systems, &player_ground_air_transition_system);
|
||||
|
|
|
@ -534,6 +534,7 @@ void init_game_scene(LevelScene_t* scene)
|
|||
sc_array_add(&scene->scene.systems, &hitbox_update_system);
|
||||
sc_array_add(&scene->scene.systems, &player_crushing_system);
|
||||
sc_array_add(&scene->scene.systems, &spike_collision_system);
|
||||
sc_array_add(&scene->scene.systems, &edge_velocity_check_system);
|
||||
sc_array_add(&scene->scene.systems, &state_transition_update_system);
|
||||
sc_array_add(&scene->scene.systems, &update_entity_emitter_system);
|
||||
sc_array_add(&scene->scene.systems, &player_ground_air_transition_system);
|
||||
|
|
|
@ -69,7 +69,7 @@ static inline void destroy_tile(LevelSceneData_t* lvl_data, unsigned int tile_id
|
|||
// ------------------------- Collision functions ------------------------------------
|
||||
// Do not subtract one for the size for any collision check, just pass normally. The extra one is important for AABB test
|
||||
|
||||
static uint8_t check_collision_and_move(
|
||||
static bool check_collision_and_move(
|
||||
TileGrid_t* tilemap,
|
||||
Entity_t* ent, Vector2* other_pos, Vector2 other_bbox,
|
||||
SolidType_t other_solid
|
||||
|
@ -81,7 +81,6 @@ static uint8_t check_collision_and_move(
|
|||
Vector2 overlap = {0,0};
|
||||
Vector2 prev_overlap = {0,0};
|
||||
uint8_t overlap_mode = find_AABB_overlap(ent->position, p_bbox->size, *other_pos, other_bbox, &overlap);
|
||||
uint8_t collided_side = 0;
|
||||
if (overlap_mode == 1)
|
||||
{
|
||||
// If there is collision, use previous overlap to determine direction
|
||||
|
@ -109,24 +108,6 @@ static uint8_t check_collision_and_move(
|
|||
offset.y = overlap.y;
|
||||
}
|
||||
}
|
||||
|
||||
if (offset.y < 0)
|
||||
{
|
||||
collided_side |= 1;
|
||||
}
|
||||
else if (offset.y > 0)
|
||||
{
|
||||
collided_side |= (1<<1);
|
||||
}
|
||||
else if (offset.x < 0)
|
||||
{
|
||||
collided_side |= (1<<2);
|
||||
}
|
||||
else if (offset.x > 0)
|
||||
{
|
||||
collided_side |= (1<<3);
|
||||
}
|
||||
|
||||
ent->position = Vector2Add(ent->position, offset);
|
||||
}
|
||||
else if (overlap_mode == 2)
|
||||
|
@ -139,7 +120,6 @@ static uint8_t check_collision_and_move(
|
|||
if (!check_collision_at(ent, point_to_test, p_bbox->size, tilemap))
|
||||
{
|
||||
ent->position = point_to_test;
|
||||
collided_side |= 1;
|
||||
goto collision_end;
|
||||
}
|
||||
|
||||
|
@ -148,7 +128,6 @@ static uint8_t check_collision_and_move(
|
|||
if (!check_collision_at(ent, point_to_test, p_bbox->size, tilemap))
|
||||
{
|
||||
ent->position = point_to_test;
|
||||
collided_side |= (1<<2);
|
||||
goto collision_end;
|
||||
}
|
||||
|
||||
|
@ -157,7 +136,6 @@ static uint8_t check_collision_and_move(
|
|||
if (!check_collision_at(ent, point_to_test, p_bbox->size, tilemap))
|
||||
{
|
||||
ent->position = point_to_test;
|
||||
collided_side |= (1<<3);
|
||||
goto collision_end;
|
||||
}
|
||||
|
||||
|
@ -166,7 +144,6 @@ static uint8_t check_collision_and_move(
|
|||
if (!check_collision_at(ent, point_to_test, p_bbox->size, tilemap))
|
||||
{
|
||||
ent->position = point_to_test;
|
||||
collided_side |= (1<<1);
|
||||
goto collision_end;
|
||||
}
|
||||
// If no free space, Move up no matter what
|
||||
|
@ -174,7 +151,7 @@ static uint8_t check_collision_and_move(
|
|||
ent->position.y = other_pos->y - p_bbox->size.y + 1;
|
||||
}
|
||||
collision_end:
|
||||
return collided_side;
|
||||
return overlap_mode > 0;
|
||||
}
|
||||
|
||||
static void destroy_entity(Scene_t* scene, TileGrid_t* tilemap, Entity_t* p_ent)
|
||||
|
@ -754,7 +731,6 @@ void tile_collision_system(Scene_t* scene)
|
|||
tile_y1 = (tile_y1 < 0) ? 0 : tile_y1;
|
||||
tile_y2 = (tile_y2 >= tilemap.height) ? tilemap.height - 1 : tile_y2;
|
||||
|
||||
uint8_t collide_side = 0;
|
||||
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++)
|
||||
|
@ -780,7 +756,7 @@ void tile_collision_system(Scene_t* scene)
|
|||
&& p_ent->position.y + p_bbox->size.y > other.y
|
||||
) ? SOLID : NOT_SOLID;
|
||||
}
|
||||
collide_side |= check_collision_and_move(
|
||||
check_collision_and_move(
|
||||
&tilemap, p_ent,
|
||||
&other,
|
||||
(Vector2){tilemap.tile_size, tilemap.tile_size},
|
||||
|
@ -808,35 +784,51 @@ void tile_collision_system(Scene_t* scene)
|
|||
{
|
||||
solid = NOT_SOLID;
|
||||
}
|
||||
collide_side |= check_collision_and_move(
|
||||
check_collision_and_move(
|
||||
&tilemap, p_ent,
|
||||
&p_other_ent->position, p_other_bbox->size,
|
||||
solid
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (collide_side & (1<<3))
|
||||
void edge_velocity_check_system(Scene_t* scene)
|
||||
{
|
||||
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
|
||||
unsigned int ent_idx;
|
||||
CBBox_t* p_bbox;
|
||||
sc_map_foreach(&scene->ent_manager.component_map[CBBOX_COMP_T], ent_idx, p_bbox)
|
||||
{
|
||||
Entity_t* p_ent = get_entity(&scene->ent_manager, ent_idx);
|
||||
CTransform_t* p_ctransform = get_component(p_ent, CTRANSFORM_COMP_T);
|
||||
if (!p_ctransform->active) continue;
|
||||
// Post movement edge check to zero out velocity
|
||||
uint8_t edges = check_bbox_edges(
|
||||
&data->tilemap, p_ent,
|
||||
p_bbox->size, false
|
||||
);
|
||||
if (edges & (1<<3))
|
||||
{
|
||||
if (p_ctransform->velocity.x < 0) p_ctransform->velocity.x = 0;
|
||||
}
|
||||
if (collide_side & (1<<2))
|
||||
if (edges & (1<<2))
|
||||
{
|
||||
if (p_ctransform->velocity.x > 0) p_ctransform->velocity.x = 0;
|
||||
}
|
||||
if (collide_side & (1<<1))
|
||||
if (edges & (1<<1))
|
||||
{
|
||||
if (p_ctransform->velocity.y < 0) p_ctransform->velocity.y = 0;
|
||||
}
|
||||
if (collide_side & (1))
|
||||
if (edges & (1))
|
||||
{
|
||||
if (p_ctransform->velocity.y > 0) p_ctransform->velocity.y = 0;
|
||||
}
|
||||
|
||||
// Deal with float precision, by rounding when it is near to an integer enough by 2 dp
|
||||
float decimal;
|
||||
float fractional = modff(p_ent->position.x, &decimal);
|
||||
if (fractional > 0.99)
|
||||
|
|
|
@ -16,6 +16,7 @@ void state_transition_update_system(Scene_t* scene);
|
|||
void update_entity_emitter_system(Scene_t* scene);
|
||||
void update_tilemap_system(Scene_t* scene);
|
||||
void hitbox_update_system(Scene_t* scene);
|
||||
void edge_velocity_check_system(Scene_t* scene);
|
||||
void sprite_animation_system(Scene_t* scene);
|
||||
void boulder_destroy_wooden_tile_system(Scene_t* scene);
|
||||
void camera_update_system(Scene_t* scene);
|
||||
|
|
Loading…
Reference in New Issue