diff options
| author | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-09-18 16:52:54 +0200 | 
|---|---|---|
| committer | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-09-18 16:52:54 +0200 | 
| commit | 8bf919f750807060f3ac2c640b8a02300af1733c (patch) | |
| tree | 7bae57855fc3b98779bdfecbea141e7ec1eed68c /gameloop/src | |
| parent | 61e382cedd71127033f91551298607e2e78c3809 (diff) | |
gameloop poc working with variable and constant update
Diffstat (limited to 'gameloop/src')
| -rw-r--r-- | gameloop/src/loopManager.cpp | 38 | ||||
| -rw-r--r-- | gameloop/src/timer.cpp | 66 | 
2 files changed, 60 insertions, 44 deletions
diff --git a/gameloop/src/loopManager.cpp b/gameloop/src/loopManager.cpp index c439a3e..f7ce886 100644 --- a/gameloop/src/loopManager.cpp +++ b/gameloop/src/loopManager.cpp @@ -19,24 +19,28 @@ void LoopManager::processInput(){  void LoopManager::fixedUpdate(){  	fprintf(stderr,"fixed update\n");  } -void LoopManager::loop(){ -	fprintf(stderr,"loop. \n"); -	LoopTimer& timer = LoopTimer::getInstance(); -	while(gameRunning){ -		timer.update(); -		lag += timer.getDeltaTime(); -		processInput(); -		while (lag >= timer.getFixedDeltaTime()) -		{ -			fixedUpdate(); -			lag -= timer.getFixedDeltaTime(); -		} -		//update(); -		//timer.enforceFrameRate(); -		render(); -	} -	window.destroyWindow(); +void LoopManager::loop() { +    LoopTimer& timer = LoopTimer::getInstance(); +    timer.start(); + +    while (gameRunning) { +        timer.update(); + +        while (timer.getLag() >= timer.getFixedDeltaTime()) { +            processInput(); +            fixedUpdate(); +            timer.advanceFixedUpdate(); +        } + +        update(); +        render(); + +        timer.enforceFrameRate(); +    } + +    window.destroyWindow();  } +  void LoopManager::setup(){  	gameRunning = window.initWindow();  	LoopTimer::getInstance().start(); diff --git a/gameloop/src/timer.cpp b/gameloop/src/timer.cpp index 6428797..1e3045f 100644 --- a/gameloop/src/timer.cpp +++ b/gameloop/src/timer.cpp @@ -1,56 +1,68 @@  #include "timer.h" -// Singleton instance for global access +// Constructor (private) +LoopTimer::LoopTimer(){} + +// Get the singleton instance of the timer  LoopTimer& LoopTimer::getInstance() {      static LoopTimer instance;      return instance;  } -// Private constructor -LoopTimer::LoopTimer() : lastTime(0), deltaTime(0), frequency(0), FPS(0), frameTargetTime(0) {} - +// 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 currentTime = SDL_GetTicks64(); -    deltaTime = (currentTime - lastFrameTime) / 1000.0; -	time += deltaTime; -    lastFrameTime = currentTime; +    uint64_t currentFrameTime = SDL_GetTicks64(); +    deltaTime = (currentFrameTime - lastFrameTime) / 1000.0;  // Convert to seconds + +    if (deltaTime > maximumDeltaTime) { +        deltaTime = maximumDeltaTime; +    } + +    elapsedTime += deltaTime; +    lastFrameTime = currentFrameTime;  } -float LoopTimer::getDeltaTime() const { +double LoopTimer::getDeltaTime() const {      return deltaTime;  } -float LoopTimer::getDeltaTimeMs() const { -    return deltaTime * 1000; -}  int LoopTimer::getCurrentTime() const { -    return SDL_GetTicks64(); +    return SDL_GetTicks();  } -float LoopTimer::getFixedDeltaTime() const { +void LoopTimer::advanceFixedUpdate() { +    elapsedFixedTime += fixedDeltaTime; +} + +double LoopTimer::getFixedDeltaTime() const {      return fixedDeltaTime;  }  void LoopTimer::setFPS(int FPS) { -    if (FPS > 0) { -        this->FPS = FPS; -        frameTargetTime = 1000 / FPS; -    } -} -float LoopTimer::getLag() const{ -	return lag; +    this->FPS = FPS; +    frameTargetTime = 1.0 / FPS;  } +  int LoopTimer::getFPS() const {      return FPS;  } -// Delay to match target frame time  void LoopTimer::enforceFrameRate() { -    int waitTime = frameTargetTime - (SDL_GetTicks64() - lastFrameTime); -	if(waitTime > 0 && waitTime <= frameTargetTime){ -		SDL_Delay(waitTime); -	} +    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;  }  |