"Sprinting"

This commit is contained in:
tovjemam 2026-03-14 19:15:28 +01:00
parent 473de216f2
commit e1f9212d3c
5 changed files with 21 additions and 1 deletions

View File

@ -145,6 +145,7 @@ static const std::map<SDL_Scancode, game::PlayerInputType> 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 },

View File

@ -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);
}

View File

@ -19,6 +19,7 @@ enum CharacterInputType
CIN_LEFT,
CIN_RIGHT,
CIN_JUMP,
CIN_SPRINT,
};
struct CapsuleShape

View File

@ -93,6 +93,11 @@ void game::PlayerCharacter::UpdateInputs()
c_in |= 1 << CIN_JUMP;
}
if (in & (1 << IN_SPRINT))
{
c_in |= 1 << CIN_SPRINT;
}
if (vehicle_)
{
SetInputs(0);

View File

@ -14,6 +14,7 @@ namespace game
IN_RIGHT,
IN_JUMP,
IN_CROUCH,
IN_SPRINT,
IN_USE,
IN_ATTACK,
IN_DEBUG1,