Nowa sprawa, nowa klasa. Nie miałem pomysłu na nazwę, więc wziąłem pierwszą lepszą na na którą wpadłem: StaticFramerate.
class StaticFramerate
{
private:
int dt;
int accumulator;
int lastUpdateTime;
int TIME_STEP;
public:
StaticFramerate();
~StaticFramerate();
void update();
bool isAccumulated();
};
Co tu dużo mówić. funkcja Update ustawia pomocniczą zmienną dt na ilosć milisekund od ostatniego sprawdzenia, odświeża zmienną z czasem ostatniego sprawdzenia i dodajewartość dt do accumulatora.
Funkcja isAccumulated sprawdza czy trzeba odświeżyć logikę gry (tzn. ustaliłem że gra ma się odświeżać 60 razy na sekundę. Jeśli od ostatniego sprawdzania minęło przynajmiej 60, 120, 180 milisekund, odświeżamy logikę gry raz, dwa, trzy itd.) i odejmuje od accumulatora 60 milisekund.
Tak wygląda teraz main:
//FPS stuff
StaticFramerate * FrameStuff = new StaticFramerate;
for (int frame = 0; ; frame++)
{
FrameStuff->update();
if (Listener->HandleEvents(&event) == -1)
break;
while(FrameStuff->isAccumulated())
{
Window->DoLogic();
}
Window->DrawScreen();
Screen->Flip();
}
Zerknij na tutek xiona
OdpowiedzUsuńhttp://xion.org.pl/productions/texts/coding/game-programming/real-time-loop/