diff options
author | heavydemon21 <nielsstunnebrink1@gmail.com> | 2024-10-01 11:05:42 +0200 |
---|---|---|
committer | heavydemon21 <nielsstunnebrink1@gmail.com> | 2024-10-01 11:05:42 +0200 |
commit | 8e66301577551bc5b8a2e169be173e71de2f5e4e (patch) | |
tree | 52797ebfe53007eaf502c9cf9aafbd34817f5d0b /mwe/gameloop/src/timer.cpp | |
parent | 2d13805218eb34b6e06205c1b65c341ebcdad504 (diff) | |
parent | f4560e02f703f1c6f857c8e5af63fa9fc4ca6438 (diff) |
Merge branch 'master' into niels/resource-manager
Diffstat (limited to 'mwe/gameloop/src/timer.cpp')
-rw-r--r-- | mwe/gameloop/src/timer.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/mwe/gameloop/src/timer.cpp b/mwe/gameloop/src/timer.cpp new file mode 100644 index 0000000..61e144d --- /dev/null +++ b/mwe/gameloop/src/timer.cpp @@ -0,0 +1,58 @@ +#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; } |