polly-b-gone/simulation.cpp
2012-12-14 09:47:48 -08:00

45 lines
1.1 KiB
C++

// -*- C++ -*-
#include <SDL/sdl.h>
#include "simulation.h"
using namespace mbostock;
/*
* If for some reason we haven't been able to run the simulation in a long time
* (e.g., the computer went to sleep for two hours!), then we don't want to run
* the simulation a zillion times to catch up. Instead we just drop some frames
* and hope it gets better.
*/
static const uint32_t maxSkippedMs = 500;
Simulation::Simulation(uint32_t timeStepMs)
: timeStepMs_(timeStepMs), skippedMs_(0), lastTimeMs_(0), paused_(false) {
}
uint32_t Simulation::elapsedMillis() {
uint32_t currentTimeMs = SDL_GetTicks();
uint32_t differenceMs = currentTimeMs - lastTimeMs_;
lastTimeMs_ = currentTimeMs;
return differenceMs;
}
void Simulation::togglePaused() {
paused_ = !paused_;
}
void Simulation::simulate() {
if (paused_ || (lastTimeMs_ == 0)) {
lastTimeMs_ = SDL_GetTicks();
return;
}
skippedMs_ += elapsedMillis();
if (skippedMs_ > maxSkippedMs) {
skippedMs_ = timeStepMs_;
}
while (skippedMs_ >= timeStepMs_) {
step();
skippedMs_ -= timeStepMs_;
}
}