From 21dafd1b6da66c0ad2dbfdfd7c12d3d65441f195 Mon Sep 17 00:00:00 2001 From: En Yi Date: Fri, 16 Jun 2023 16:28:19 +0800 Subject: [PATCH] Add kinematic mode to movement Changelog: - Kinematic mode ignores accelerations, that's all - Update moveable to use kinematic mode and set accel & velocity to zero when entering gridmove mode --- scenes/engine/EC/EC.h | 8 +++++++- scenes/game_systems.c | 27 ++++++++++++++++++--------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/scenes/engine/EC/EC.h b/scenes/engine/EC/EC.h index 0e41feb..916eeec 100644 --- a/scenes/engine/EC/EC.h +++ b/scenes/engine/EC/EC.h @@ -26,6 +26,11 @@ typedef enum ComponentEnum { CMOVEABLE_T, } ComponentEnum_t; +typedef enum MovementMode { + REGULAR_MOVEMENT = 0, + KINEMATIC_MOVEMENT, +}MovementMode_t; + typedef struct _CBBox_t { Vector2 size; Vector2 offset; @@ -36,13 +41,14 @@ typedef struct _CBBox_t { typedef struct _CTransform_t { Vector2 prev_position; + Vector2 prev_velocity; Vector2 position; Vector2 velocity; - Vector2 prev_velocity; Vector2 accel; Vector2 fric_coeff; int8_t grav_delay; int8_t grav_timer; + MovementMode_t movement_mode; } CTransform_t; typedef struct _CMovementState_t { diff --git a/scenes/game_systems.c b/scenes/game_systems.c index fc75dec..993d71e 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -912,8 +912,6 @@ void moveable_update_system(Scene_t* scene) if (p_moveable->gridmove) { - memset(&p_ctransform->velocity, 0, sizeof(p_ctransform->velocity)); - memset(&p_ctransform->accel, 0, sizeof(p_ctransform->velocity)); float remaining_distance = p_moveable->target_pos.x - p_ctransform->position.x; if (fabs(remaining_distance) < 0.1) { @@ -921,6 +919,7 @@ void moveable_update_system(Scene_t* scene) p_ctransform->position = p_moveable->target_pos; p_moveable->gridmove = false; p_bbox->solid = true; + p_ctransform->movement_mode = REGULAR_MOVEMENT; } else if (remaining_distance > 0.1) { @@ -929,6 +928,7 @@ void moveable_update_system(Scene_t* scene) else { p_ctransform->position.x += (remaining_distance < -p_moveable->move_speed) ? -p_moveable->move_speed : remaining_distance; + memset(&p_ctransform->velocity, 0, sizeof(p_ctransform->velocity)); } } @@ -1035,6 +1035,9 @@ void moveable_update_system(Scene_t* scene) p_bbox->solid = false; p_moveable->prev_pos = p_ctransform->position; p_moveable->target_pos = Vector2Scale((Vector2){tile_x,tile_y2}, TILE_SIZE); + memset(&p_ctransform->velocity, 0, sizeof(p_ctransform->velocity)); + memset(&p_ctransform->accel, 0, sizeof(p_ctransform->accel)); + p_ctransform->movement_mode = KINEMATIC_MOVEMENT; } } @@ -1119,6 +1122,9 @@ void player_pushing_system(Scene_t* scene) p_other_moveable->gridmove = true; p_other_moveable->prev_pos = p_other_ct->position; p_other_moveable->target_pos = target_pos; + memset(&p_ctransform->velocity, 0, sizeof(p_ctransform->velocity)); + memset(&p_ctransform->accel, 0, sizeof(p_ctransform->accel)); + p_other_ct->movement_mode = KINEMATIC_MOVEMENT; } } } @@ -1137,11 +1143,15 @@ void movement_update_system(Scene_t* scene) sc_map_foreach(&scene->ent_manager.component_map[CTRANSFORM_COMP_T], ent_idx, p_ctransform) { p_ctransform->prev_velocity = p_ctransform->velocity; - p_ctransform->velocity = - Vector2Add( - p_ctransform->velocity, - Vector2Scale(p_ctransform->accel, delta_time) - ); + + if (p_ctransform->movement_mode == REGULAR_MOVEMENT) + { + p_ctransform->velocity = + Vector2Add( + p_ctransform->velocity, + Vector2Scale(p_ctransform->accel, delta_time) + ); + } float mag = Vector2Length(p_ctransform->velocity); p_ctransform->velocity = Vector2Scale( @@ -1159,8 +1169,7 @@ void movement_update_system(Scene_t* scene) p_ctransform->position, Vector2Scale(p_ctransform->velocity, delta_time) ); - p_ctransform->accel.x = 0; - p_ctransform->accel.y = 0; + memset(&p_ctransform->accel, 0, sizeof(p_ctransform->accel)); // Level boundary collision Entity_t* p_ent = get_entity(&scene->ent_manager, ent_idx);