Ta méthode Moteur::boucleJeu() ne gère pas le temps dans le while.
rajouter un sf::sleep devrait régler le problème.
(et soulager ton processeur
)
Voici un lien vers le tutoriel correspondant :
Tutoriel - Système - Gérer le temps.
Jette aussi un coup d'œil à
sf::Clock.
EDIT :
Pour être plus précis :
while(m_fenetre->isOpen()){
//stuff
}
s’exécutera le plus vite possible.
sf::sleep() fait une pause dans l'exécution du programme :
/!\ Attention/!\sf::sleep() prends un sf::Time en argument avec la SFML2.
while(m_fenetre->isOpen()){
//stuff
sf::sleep(sf::seconds(1.f/60.f))
}
Avec le code ci-dessus tes FPS seront légèrement inférieures à 60 du à la durée d’exécution de //stuff
pour corriger ça je te propose de chronométrer la durée de ta boucle et de l'ôter à sf::sleep() :
sf::Clock chrono;
while(m_fenetre->isOpen()){
//stuff
sf::sleep(sf::seconds(1.f/60.f - chrono.getElapsedTime().asSeconds()));
chrono.restart();
}
Tu peux désormais considérer qu'il se passe toujours la même durée entre deux frames;
/!\ Attention /!\Si ton code met plus de 1/60
ème de seconde à s’exécuter sf::sleep() ne servira à rien;
tu devras considérer un FPS plus bas. (1/20
ème est encore correct pour un jeu
)
Protip const sf::Time FRAME__TIME = sf::seconds(1.f/60.f);
float time_delta; //temps écoulé durant la dernière frame (en secondes)
while(m_fenetre->isOpen()){
//stuff
time_delta = chrono.getElapsedTime().asSeconds();
sf::sleep(FRAME_TIME - chrono.restart());
}
sf::Time possède un opérateur - ;
sf::Clock::restart() retourne un sf::Time ;
utilise les pour simplifier ton code;
Et
time_delta permet d'obtenir des mouvements "parfaitement" chronométrés quelque-soit les FPS :
déplacement en 1 seconde * fraction de seconde = déplacement durant une fraction de secondePS : J'en ai peut-être fait un peu trop.
J’espère avoir été utile.
et bonne journée.