aboutsummaryrefslogtreecommitdiff
path: root/mwe/gameloop/src/timer.cpp
diff options
context:
space:
mode:
authorheavydemon21 <nielsstunnebrink1@gmail.com>2024-10-01 11:05:42 +0200
committerheavydemon21 <nielsstunnebrink1@gmail.com>2024-10-01 11:05:42 +0200
commit8e66301577551bc5b8a2e169be173e71de2f5e4e (patch)
tree52797ebfe53007eaf502c9cf9aafbd34817f5d0b /mwe/gameloop/src/timer.cpp
parent2d13805218eb34b6e06205c1b65c341ebcdad504 (diff)
parentf4560e02f703f1c6f857c8e5af63fa9fc4ca6438 (diff)
Merge branch 'master' into niels/resource-manager
Diffstat (limited to 'mwe/gameloop/src/timer.cpp')
-rw-r--r--mwe/gameloop/src/timer.cpp58
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; }