diff options
author | Loek Le Blansch <loek@pipeframe.xyz> | 2024-09-21 15:31:58 +0200 |
---|---|---|
committer | Loek Le Blansch <loek@pipeframe.xyz> | 2024-09-21 15:31:58 +0200 |
commit | ca393b6b47618e48c107ad5c021d86700343648e (patch) | |
tree | 298bff793ee331566b6be1840c8d7404409b5198 /mwe/gameloop/src/timer.cpp | |
parent | 8bf919f750807060f3ac2c640b8a02300af1733c (diff) |
move gameloop poc to mwe
Diffstat (limited to 'mwe/gameloop/src/timer.cpp')
-rw-r--r-- | mwe/gameloop/src/timer.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/mwe/gameloop/src/timer.cpp b/mwe/gameloop/src/timer.cpp new file mode 100644 index 0000000..1e3045f --- /dev/null +++ b/mwe/gameloop/src/timer.cpp @@ -0,0 +1,68 @@ +#include "timer.h" + +// Constructor (private) +LoopTimer::LoopTimer(){} + +// Get the singleton instance of the timer +LoopTimer& LoopTimer::getInstance() { + static LoopTimer instance; + return instance; +} + +// Start the timer (initialize frame time) +void LoopTimer::start() { + lastFrameTime = SDL_GetTicks64(); + elapsedTime = 0; + elapsedFixedTime = 0; + deltaTime = 0; +} + +// Update the timer, calculate deltaTime +void LoopTimer::update() { + uint64_t currentFrameTime = SDL_GetTicks64(); + deltaTime = (currentFrameTime - lastFrameTime) / 1000.0; // Convert to seconds + + if (deltaTime > maximumDeltaTime) { + deltaTime = maximumDeltaTime; + } + + elapsedTime += deltaTime; + lastFrameTime = currentFrameTime; +} + +double LoopTimer::getDeltaTime() const { + return deltaTime; +} +int LoopTimer::getCurrentTime() const { + return SDL_GetTicks(); +} + +void LoopTimer::advanceFixedUpdate() { + elapsedFixedTime += fixedDeltaTime; +} + +double LoopTimer::getFixedDeltaTime() const { + return fixedDeltaTime; +} + +void LoopTimer::setFPS(int FPS) { + this->FPS = FPS; + frameTargetTime = 1.0 / FPS; +} + +int LoopTimer::getFPS() const { + return FPS; +} + +void LoopTimer::enforceFrameRate() { + uint64_t currentFrameTime = SDL_GetTicks64(); + double frameDuration = (currentFrameTime - lastFrameTime) / 1000.0; + + if (frameDuration < frameTargetTime) { + uint32_t delayTime = (uint32_t)((frameTargetTime - frameDuration) * 1000.0); + SDL_Delay(delayTime); + } +} +double LoopTimer::getLag() const { + return elapsedTime - elapsedFixedTime; +} |