Autorise la boucle de rendu à sauter des frames si on est en retard

This commit is contained in:
Mattéo Delabre 2016-04-12 21:04:31 +02:00
parent 67074e9050
commit ccf04a9bf3
2 changed files with 31 additions and 11 deletions

View File

@ -21,13 +21,15 @@ public:
enum class DeathCause {NONE, OUT_OF_BOUNDS, KILLED, TIME_OUT}; enum class DeathCause {NONE, OUT_OF_BOUNDS, KILLED, TIME_OUT};
private: private:
WidgetTimer widget_timer;
sf::Time next_frame_time;
std::vector<Object::Ptr> pending_kill;
Mode mode; Mode mode;
sf::Time next_frame_time;
unsigned int skipped_frames;
std::vector<Object::Ptr> pending_kill;
DeathCause death_cause; DeathCause death_cause;
WidgetTimer widget_timer;
float time_left; float time_left;
/** /**

View File

@ -4,13 +4,23 @@
#include "game.hpp" #include "game.hpp"
#include "player.hpp" #include "player.hpp"
Game::Game(Manager& manager) : Level(manager), /**
widget_timer(manager, false), * Définition des variables et fonctions globales internes
next_frame_time(manager.getCurrentTime()) { * (accessibles uniquement dans ce fichier)
mode = Game::Mode::NORMAL; */
death_cause = Game::DeathCause::NONE; namespace {
// nombre maximum de frames que l'on peut sauter
// en cas de charge CPU importante
const unsigned int MAX_FRAME_SKIP = 5;
} }
Game::Game(Manager& manager) : Level(manager),
mode(Game::Mode::NORMAL),
next_frame_time(manager.getCurrentTime()),
skipped_frames(0),
death_cause(Game::DeathCause::NONE),
widget_timer(manager, false) {}
Game::~Game() {} Game::~Game() {}
void Game::processEvent(const sf::Event& event) { void Game::processEvent(const sf::Event& event) {
@ -95,10 +105,18 @@ void Game::frame() {
// on s'assure que la caméra soit centrée sur nos joueurs // on s'assure que la caméra soit centrée sur nos joueurs
ensureCentered(); ensureCentered();
// si on a encore suffisamment de temps, on dessine // si on a encore suffisamment de temps, ou si on a sauté
if (current_time < next_frame_time) { // trop de frames, on dessine
if (current_time < next_frame_time || skipped_frames >= MAX_FRAME_SKIP) {
draw(); draw();
} }
// sinon, on saute une frame de dessin. On stocke
// le nombre de frames sautées pour ne pas sauter plus que
// le maximum
else {
skipped_frames++;
}
} else { } else {
// si nous sommes en avance, on endort le processus // si nous sommes en avance, on endort le processus
// le temps nécessaire pour revenir dans les temps // le temps nécessaire pour revenir dans les temps