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};
private:
WidgetTimer widget_timer;
sf::Time next_frame_time;
std::vector<Object::Ptr> pending_kill;
Mode mode;
sf::Time next_frame_time;
unsigned int skipped_frames;
std::vector<Object::Ptr> pending_kill;
DeathCause death_cause;
WidgetTimer widget_timer;
float time_left;
/**

View File

@ -4,13 +4,23 @@
#include "game.hpp"
#include "player.hpp"
Game::Game(Manager& manager) : Level(manager),
widget_timer(manager, false),
next_frame_time(manager.getCurrentTime()) {
mode = Game::Mode::NORMAL;
death_cause = Game::DeathCause::NONE;
/**
* Définition des variables et fonctions globales internes
* (accessibles uniquement dans ce fichier)
*/
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() {}
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
ensureCentered();
// si on a encore suffisamment de temps, on dessine
if (current_time < next_frame_time) {
// si on a encore suffisamment de temps, ou si on a sauté
// trop de frames, on dessine
if (current_time < next_frame_time || skipped_frames >= MAX_FRAME_SKIP) {
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 {
// si nous sommes en avance, on endort le processus
// le temps nécessaire pour revenir dans les temps