Intrebute
6/13/2017 - 12:01 AM

Basic implementation of Gaffer on Games' "Fix Your Timestep!" game loop, using SFML. http://gafferongames.com/game-physics/fix-your-timestep

Basic implementation of Gaffer on Games' "Fix Your Timestep!" game loop, using SFML. http://gafferongames.com/game-physics/fix-your-timestep/

std::tuple<int, double> fit(double total, double piece)
{
	if (piece == 0)
		return std::make_pair(0, 0);

	int quot = static_cast<int>(total / piece);
	double rem = total - quot * piece;
	return std::make_pair(quot, rem);
}

int main()
{
	sf::RenderWindow window(sf::VideoMode(640, 480), "Default name");
	window.setFramerateLimit(60);
	
	sf::Clock frameClock;
	const double fps = 120;
	const sf::Time frameQuota = sf::seconds(1 / fps);
	sf::Time overtime = sf::seconds(0);
	
  	while (window.isOpen())
	{
  		sf::Event event;
		//// This is just to allow the window to be closed in the first place.
		while (window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed)
				window.close();
			if (event.type == sf::Event::KeyPressed)
			{
				if (event.key.code == sf::Keyboard::Escape)
				{
					window.close();
				}
			}
		}
	
  		sf::Time delTime(frameClock.restart());
  		if (delTime < frameQuota - overtime)
		{
			overtime += delTime;
		}
  		else
		{
			auto p = fit((delTime + overtime).asSeconds(), frameQuota.asSeconds());
			int framecount = std::get<0>(p);
			overtime = sf::seconds(std::get<1>(p));
			
			for(int i = 0; i < framecount; ++i) { 
				// LOGIC TICK HERE
			}
		}
		
		{ // RENDERING
			window.clear(sf::Color(200, 200, 200));
			
			window.display();
		}
	}
 	return 0;
}