Fixation de l'étape temporelle de la simulation
This commit is contained in:
parent
ecc6a3d006
commit
4d3fc1851d
|
@ -34,6 +34,11 @@ namespace Constants {
|
||||||
*/
|
*/
|
||||||
static constexpr bool DEBUG_MODE = false;
|
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
|
* Correction positionnelle : pourcentage de correction
|
||||||
* et seuil de correction
|
* et seuil de correction
|
||||||
|
|
|
@ -16,9 +16,8 @@ class Object;
|
||||||
struct EngineState {
|
struct EngineState {
|
||||||
std::vector<Object*> objects;
|
std::vector<Object*> objects;
|
||||||
std::array<bool, sf::Keyboard::KeyCount> keys;
|
std::array<bool, sf::Keyboard::KeyCount> keys;
|
||||||
float delta;
|
|
||||||
|
|
||||||
EngineState() : delta(0.f) {
|
EngineState() {
|
||||||
// aucune touche n'est enfoncée au démarrage
|
// aucune touche n'est enfoncée au démarrage
|
||||||
keys.fill(false);
|
keys.fill(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "engine.hpp"
|
#include "engine.hpp"
|
||||||
|
#include "constants.hpp"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
|
@ -11,6 +12,8 @@ Engine::Engine() : window(
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::start() {
|
void Engine::start() {
|
||||||
|
float accumulator = 0;
|
||||||
|
|
||||||
// boucle d'événements sur la fenêtre
|
// boucle d'événements sur la fenêtre
|
||||||
while (window.isOpen()) {
|
while (window.isOpen()) {
|
||||||
sf::Event event;
|
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();
|
draw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,11 +80,11 @@ void Object::update(EngineState& state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// intégration de la vitesse dans la position
|
// 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
|
// intégration des forces appliquées sur l'objet dans la vitesse
|
||||||
acceleration = getForces(state) / mass;
|
acceleration = getForces(state) / mass;
|
||||||
velocity += acceleration * state.delta;
|
velocity += acceleration * Constants::PHYSICS_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Object::getCollisionInfo(Object& obj, sf::Vector2f& normal, float& depth) {
|
bool Object::getCollisionInfo(Object& obj, sf::Vector2f& normal, float& depth) {
|
||||||
|
|
Loading…
Reference in New Issue