From e1f9212d3cca5e78b2bcc54ee177feab06c002be Mon Sep 17 00:00:00 2001 From: tovjemam Date: Sat, 14 Mar 2026 19:15:28 +0100 Subject: [PATCH] "Sprinting" --- src/client/main.cpp | 1 + src/game/character.cpp | 14 +++++++++++++- src/game/character.hpp | 1 + src/game/player_character.cpp | 5 +++++ src/game/player_input.hpp | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/client/main.cpp b/src/client/main.cpp index d6ffbaf..e8ac182 100644 --- a/src/client/main.cpp +++ b/src/client/main.cpp @@ -145,6 +145,7 @@ static const std::map s_inputmap = { { SDL_SCANCODE_A, game::IN_LEFT }, { SDL_SCANCODE_D, game::IN_RIGHT }, { SDL_SCANCODE_SPACE, game::IN_JUMP }, + { SDL_SCANCODE_LSHIFT, game::IN_SPRINT }, { SDL_SCANCODE_LCTRL, game::IN_CROUCH }, { SDL_SCANCODE_E, game::IN_USE }, { SDL_SCANCODE_F3, game::IN_DEBUG1 }, diff --git a/src/game/character.cpp b/src/game/character.cpp index 8a5833c..cab38ef 100644 --- a/src/game/character.cpp +++ b/src/game/character.cpp @@ -155,7 +155,9 @@ void game::Character::SyncTransformFromController() void game::Character::UpdateMovement() { constexpr float dt = 1.0f / 25.0f; + constexpr float running_mult = 3.0f; bool walking = false; + bool running = false; glm::vec2 movedir(0.0f); if (in_ & (1 << CIN_FORWARD)) @@ -175,11 +177,19 @@ void game::Character::UpdateMovement() if (movedir.x != 0.0f || movedir.y != 0.0f) { walking = true; + + if (in_ & (1 << CIN_SPRINT)) + running = true; + float target_yaw = forward_yaw_ + std::atan2(movedir.y, movedir.x); - Turn(yaw_, target_yaw, 4.0f * dt); + Turn(yaw_, target_yaw, 8.0f * dt); glm::vec3 forward_dir(glm::cos(yaw_), glm::sin(yaw_), 0.0f); walkdir = forward_dir * walk_speed_ * dt; + + if (running) + walkdir *= running_mult; + } if (controller_) @@ -197,6 +207,8 @@ void game::Character::UpdateMovement() float run_blend_target = walking ? 0.5f : 0.0f; MoveToward(animstate_.loco_blend, run_blend_target, dt * 2.0f); float anim_speed = glm::mix(0.5f, 1.5f, UnMix(0.0f, 0.5f, animstate_.loco_blend)); + if (running) + anim_speed *= running_mult; animstate_.loco_phase = glm::mod(animstate_.loco_phase + anim_speed * dt, 1.0f); } diff --git a/src/game/character.hpp b/src/game/character.hpp index 4544809..660d535 100644 --- a/src/game/character.hpp +++ b/src/game/character.hpp @@ -19,6 +19,7 @@ enum CharacterInputType CIN_LEFT, CIN_RIGHT, CIN_JUMP, + CIN_SPRINT, }; struct CapsuleShape diff --git a/src/game/player_character.cpp b/src/game/player_character.cpp index c12a355..e9a5e47 100644 --- a/src/game/player_character.cpp +++ b/src/game/player_character.cpp @@ -92,6 +92,11 @@ void game::PlayerCharacter::UpdateInputs() { c_in |= 1 << CIN_JUMP; } + + if (in & (1 << IN_SPRINT)) + { + c_in |= 1 << CIN_SPRINT; + } if (vehicle_) { diff --git a/src/game/player_input.hpp b/src/game/player_input.hpp index a7b65a2..0380d75 100644 --- a/src/game/player_input.hpp +++ b/src/game/player_input.hpp @@ -14,6 +14,7 @@ namespace game IN_RIGHT, IN_JUMP, IN_CROUCH, + IN_SPRINT, IN_USE, IN_ATTACK, IN_DEBUG1,