Effectue la conversion du temps en secondes en dernière instance

Pour une meilleure précision
This commit is contained in:
Mattéo Delabre 2016-04-03 12:34:10 +02:00
parent b3d2c50314
commit 53c4573edb
6 changed files with 17 additions and 18 deletions

View File

@ -27,7 +27,7 @@ namespace Constants {
/** /**
* Durée fixe d'une étape de simulation physique * Durée fixe d'une étape de simulation physique
*/ */
static const float PHYSICS_TIME = 1.f / 60; static const sf::Time PHYSICS_TIME = sf::seconds(1.f / 60);
/** /**
* Correction positionnelle : pourcentage de correction * Correction positionnelle : pourcentage de correction

View File

@ -18,7 +18,7 @@ private:
std::string level_name; std::string level_name;
sf::Sprite background; sf::Sprite background;
float accumulator; sf::Time accumulator;
std::vector<ObjectPtr> objects; std::vector<ObjectPtr> objects;
std::vector<std::pair<float, float>> level_zone; std::vector<std::pair<float, float>> level_zone;

View File

@ -14,7 +14,7 @@ private:
sf::RenderWindow window; sf::RenderWindow window;
sf::Clock clock; sf::Clock clock;
float elapsed_time; sf::Time elapsed_time;
ResourceManager resource_manager; ResourceManager resource_manager;
std::array<bool, sf::Keyboard::KeyCount> keys; std::array<bool, sf::Keyboard::KeyCount> keys;
@ -42,7 +42,7 @@ public:
* Renvoie le temps écoulé entre la frame précédente * Renvoie le temps écoulé entre la frame précédente
* et la frame actuelle * et la frame actuelle
*/ */
float getElapsedTime() const; sf::Time getElapsedTime() const;
/** /**
* Renvoie le gestionnaire de ressources * Renvoie le gestionnaire de ressources

View File

@ -19,7 +19,7 @@ std::map<unsigned int, std::function<std::shared_ptr<Object>(std::ifstream&)>> o
{Block::TYPE_ID, Block::load} {Block::TYPE_ID, Block::load}
}; };
Game::Game(Manager& manager) : View(manager), accumulator(0.f) {} Game::Game(Manager& manager) : View(manager), accumulator(sf::Time::Zero) {}
Game::~Game() { Game::~Game() {
objects.clear(); objects.clear();
} }
@ -109,16 +109,15 @@ void Game::save() {
} }
void Game::frame() { void Game::frame() {
accumulator += manager.getElapsedTime();
// tant qu'il reste du temps à passer, // tant qu'il reste du temps à passer,
// effectuer la simulation physique étape par étape // effectuer la simulation physique étape par étape
while (accumulator >= Constants::PHYSICS_TIME) { while (accumulator > Constants::PHYSICS_TIME) {
accumulator -= Constants::PHYSICS_TIME; accumulator -= Constants::PHYSICS_TIME;
update(); update();
} }
draw(); draw();
accumulator += manager.getElapsedTime();
} }
void Game::update() { void Game::update() {
@ -140,7 +139,7 @@ void Game::update() {
// intégration des forces dans la vitesse (première moitié) // intégration des forces dans la vitesse (première moitié)
for (unsigned int i = 0; i < objects.size(); i++) { for (unsigned int i = 0; i < objects.size(); i++) {
objects[i]->updateVelocity(manager, objects, Constants::PHYSICS_TIME / 2); objects[i]->updateVelocity(manager, objects, Constants::PHYSICS_TIME.asSeconds() / 2);
} }
// résolution des collisions détectées // résolution des collisions détectées
@ -151,7 +150,7 @@ void Game::update() {
// intégration de la vitesse dans la position // intégration de la vitesse dans la position
for (unsigned int i = 0; i < objects.size(); i++) { for (unsigned int i = 0; i < objects.size(); i++) {
objects[i]->updatePosition(Constants::PHYSICS_TIME); objects[i]->updatePosition(Constants::PHYSICS_TIME.asSeconds());
} }
// application de la correction positionnelle // application de la correction positionnelle
@ -164,7 +163,7 @@ void Game::update() {
// intégration des forces dans la vitesse (seconde moitié) // intégration des forces dans la vitesse (seconde moitié)
for (unsigned int i = 0; i < objects.size(); i++) { for (unsigned int i = 0; i < objects.size(); i++) {
objects[i]->updateVelocity(manager, objects, Constants::PHYSICS_TIME / 2); objects[i]->updateVelocity(manager, objects, Constants::PHYSICS_TIME.asSeconds() / 2);
} }
} }

View File

@ -3,7 +3,7 @@
Manager::Manager() : window( Manager::Manager() : window(
sf::VideoMode(704, 480), "Projet CMI", sf::Style::Default, sf::VideoMode(704, 480), "Projet CMI", sf::Style::Default,
sf::ContextSettings(0, 0, 2) sf::ContextSettings(0, 0, 2)
), elapsed_time(0.f), view(NULL) { ), elapsed_time(sf::Time::Zero), view(NULL) {
keys.fill(false); keys.fill(false);
} }
@ -29,7 +29,7 @@ void Manager::start() {
} }
// lorsque la fenêtre est redimensionnée par l'utilisateur // lorsque la fenêtre est redimensionnée par l'utilisateur
if (event.type == sf::Event::Resized){ if (event.type == sf::Event::Resized) {
// mise à jour de la caméra en fonction de la taille de la fenêtre // mise à jour de la caméra en fonction de la taille de la fenêtre
sf::FloatRect visibleArea(0, 0, event.size.width, event.size.height); sf::FloatRect visibleArea(0, 0, event.size.width, event.size.height);
window.setView(sf::View(visibleArea)); window.setView(sf::View(visibleArea));
@ -42,7 +42,7 @@ void Manager::start() {
throw std::runtime_error("Aucune vue à afficher pour le jeu"); throw std::runtime_error("Aucune vue à afficher pour le jeu");
} }
elapsed_time = clock.restart().asSeconds(); elapsed_time = clock.restart();
view->frame(); view->frame();
} }
} }
@ -55,7 +55,7 @@ sf::RenderWindow& Manager::getWindow() {
return window; return window;
} }
float Manager::getElapsedTime() const { sf::Time Manager::getElapsedTime() const {
return elapsed_time; return elapsed_time;
} }

View File

@ -65,7 +65,7 @@ void Player::draw(Manager& manager) {
); );
// déplacement du sprite à la position de la balle // déplacement du sprite à la position de la balle
sprite.rotate(getVelocity().x * Constants::PHYSICS_TIME * .5f); sprite.rotate(getVelocity().x * Constants::PHYSICS_TIME.asSeconds() * .5f);
sprite.setPosition(getPosition()); sprite.setPosition(getPosition());
manager.getWindow().draw(sprite); manager.getWindow().draw(sprite);
} }