diff --git a/include/constants.hpp b/include/constants.hpp index f2e4dd6..55466f9 100644 --- a/include/constants.hpp +++ b/include/constants.hpp @@ -34,6 +34,11 @@ namespace Constants { */ static constexpr bool DEBUG_MODE = false; + /** + * Durée fixe d'une étape de simulation physique + */ + static constexpr float PHYSICS_TIME = 1.f / 60; + /** * Correction positionnelle : pourcentage de correction * et seuil de correction diff --git a/include/engine_state.hpp b/include/engine_state.hpp index 22440ef..fc28498 100644 --- a/include/engine_state.hpp +++ b/include/engine_state.hpp @@ -16,9 +16,8 @@ class Object; struct EngineState { std::vector objects; std::array keys; - float delta; - EngineState() : delta(0.f) { + EngineState() { // aucune touche n'est enfoncée au démarrage keys.fill(false); } diff --git a/src/engine.cpp b/src/engine.cpp index fa31415..f391d00 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -1,4 +1,5 @@ #include "engine.hpp" +#include "constants.hpp" #include #include @@ -11,6 +12,8 @@ Engine::Engine() : window( } void Engine::start() { + float accumulator = 0; + // boucle d'événements sur la fenêtre while (window.isOpen()) { sf::Event event; @@ -32,9 +35,16 @@ void Engine::start() { } } - state.delta = clock.restart().asSeconds(); + float frame = clock.restart().asSeconds(); + accumulator += frame; + + // tant qu'il reste du temps à passer, + // effectuer la simulation physique étape par étape + while (accumulator >= Constants::PHYSICS_TIME) { + accumulator -= Constants::PHYSICS_TIME; + update(); + } - update(); draw(); } } diff --git a/src/object.cpp b/src/object.cpp index 8231a00..4dc66ca 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -80,11 +80,11 @@ void Object::update(EngineState& state) { } // intégration de la vitesse dans la position - position += velocity * state.delta; + position += velocity * Constants::PHYSICS_TIME; // intégration des forces appliquées sur l'objet dans la vitesse acceleration = getForces(state) / mass; - velocity += acceleration * state.delta; + velocity += acceleration * Constants::PHYSICS_TIME; } bool Object::getCollisionInfo(Object& obj, sf::Vector2f& normal, float& depth) {