diff --git a/DogTales/src/components/physics.cpp b/DogTales/src/components/physics.cpp index b151ca7..b383bee 100644 --- a/DogTales/src/components/physics.cpp +++ b/DogTales/src/components/physics.cpp @@ -2,28 +2,22 @@ namespace component { -Physics::Physics(glm::vec2 friction, float gravity, float mass) : m_friction(friction), m_gravity(gravity), m_mass(mass) {} - -void Physics::tick(bave::Seconds const dt) { +void Physics::tick(bave::Seconds dt) { static constexpr bave::Seconds ft{0.005}; // 5ms - if (dt.count() > tick_limit) { return; } // return for unexpected dt values, particularly during the beginning of the state + if (dt.count() > tick_limit_v.count()) { return; } // return for unexpected dt values, particularly during the beginning of the state - for (bave::Seconds t{}; t <= dt; t += ft) { - integrate(t.count()); - } + for (dt += m_residue; dt > ft; dt -= ft) { integrate(ft); } + m_residue = dt; } -void Physics::integrate(float dt) { - m_acceleration.y += m_gravity * dt; - m_velocity = (m_velocity + (m_acceleration / m_mass) * dt) * m_friction; +void Physics::integrate(bave::Seconds dt) { + acceleration.y += gravity * dt.count(); + velocity = (velocity + (acceleration / mass) * dt.count()) * friction; - m_velocity.x = m_velocity.x > max_velocity.x ? max_velocity.x : m_velocity.x; - m_velocity.y = m_velocity.y > max_velocity.y ? max_velocity.y : m_velocity.y; - m_velocity.x = m_velocity.x < -max_velocity.x ? -max_velocity.x : m_velocity.x; - m_velocity.y = m_velocity.y < -max_velocity.y ? -max_velocity.y : m_velocity.y; + velocity = glm::clamp(velocity, -max_velocity_v, max_velocity_v); - m_position += m_velocity * dt; + position += velocity * dt.count(); } } // namespace component diff --git a/DogTales/src/components/physics.hpp b/DogTales/src/components/physics.hpp index e2882bb..c7bedd5 100644 --- a/DogTales/src/components/physics.hpp +++ b/DogTales/src/components/physics.hpp @@ -4,25 +4,31 @@ namespace component { -static constexpr glm::vec2 max_velocity{1000.f, 1000.f}; -static constexpr float tick_limit{0.03f}; //this should possibly go somewhere else and be globally accessible +constexpr glm::vec2 default_friction{0.999f}; +constexpr float default_gravity{-1000.f}; +constexpr float default_mass{1.f}; + +constexpr glm::vec2 max_velocity_v{1000.f}; +constexpr bave::Seconds tick_limit_v{100ms}; class Physics { + bave::Seconds m_residue{}; + public: - glm::vec2 m_position{}; - glm::vec2 m_velocity{}; - glm::vec2 m_acceleration{}; - - glm::vec2 m_friction{}; - float m_gravity{}; - float m_mass{}; + Physics(glm::vec2 fric = default_friction, float grav = default_gravity, float m = default_mass) : friction(fric), gravity(grav), mass(m) {} + + glm::vec2 position{}; + glm::vec2 velocity{}; + glm::vec2 acceleration{}; - Physics(glm::vec2 friction, float gravity, float mass = 1.f); + glm::vec2 friction{}; + float gravity{}; + float mass{}; - void tick(bave::Seconds const dt); - void integrate(float dt); + void tick(bave::Seconds dt); + void integrate(bave::Seconds dt); }; } // namespace component diff --git a/DogTales/src/player.cpp b/DogTales/src/player.cpp index 664ce83..fd58148 100644 --- a/DogTales/src/player.cpp +++ b/DogTales/src/player.cpp @@ -5,7 +5,7 @@ Player::Player(glm::vec2 const world_space) : m_world_space(world_space) { m_spr void Player::tick(bave::Seconds const dt) { m_physics.tick(dt); - m_sprite.transform.position = m_physics.m_position; + m_sprite.transform.position = m_physics.position; handle_wall_collision(); } diff --git a/DogTales/src/player.hpp b/DogTales/src/player.hpp index 5b221c9..735fd57 100644 --- a/DogTales/src/player.hpp +++ b/DogTales/src/player.hpp @@ -12,7 +12,7 @@ class Player { bave::Sprite m_sprite{}; glm::vec2 m_vel{speed_v}; - component::Physics m_physics{{0.999f, 0.999f}, -1000.f}; + component::Physics m_physics{}; void handle_wall_collision();