class Timer
{
private:
//The clock time when the timer started
int startTicks;
//The ticks stored when the timer was paused
int pausedTicks;
//The timer status
bool paused;
bool started;
public:
//Initializes variables
Timer();
//The various clock actions
void start();
void stop();
void pause();
void unpause();
//Gets the timer's time
int get_ticks();
//Checks the status of the timer
bool is_started();
bool is_paused();
};
Funkcja start sprawdza, czy timer przypadkiem nie został już uruchomiony. Jeśli nie, ustawiamy started na "true", a startTicks na wartość SDL_GetTicks() (zwraca ona ilość milisekund od zainicjowania biblioteki SDL).
Funkcja stop ustawia started i paused na "false".
Funkcja pause sprawdza, czy timer jest uruchomiony i czy nie jest już zpauzowany. Jeśli nie, zapisujemy do pausedTicks obecną ilość milisekund. Dzięki temu w funkcji unpause przestawimy startTicks na ilość milisekund, przez które Timer był zpauzowany, dając poprawny wynik w get_ticks.
Mała zmiana w main.cpp i gotowe!
Timer *fps = new Timer;
for (int frame = 0; ; frame++)
{
fps->start();
if (Listener->HandleEvents(&event) == -1)
break;
Window->DoLogic();
Window->DrawScreen();
Screen->Flip();
if(fps->get_ticks() < 1000 / FRAMES_PER_SECOND)
{
//Sleep the remaining frame time
SDL_Delay((1000/FRAMES_PER_SECOND) - fps->get_ticks());
}
}
Sprawdzamy czy wygenerowanie jednej klatki zajęło MNIEJ niż 60 milisekund. Jeśli tak, musimy chwilę poczekać.
Mała rada: nie ograniczaj FPS-ów tylko oprzyj obliczanie fizyki o czas(+ ewentualnie ustaw stały krok czasowy dla nich, by nie liczyć jej "za dużo" razy na sekundę).
OdpowiedzUsuńhttp://temporal.pr0.pl/devblog/download/arts/fixed_step/fixed_step.pdf