diff options
Diffstat (limited to 'mwe/gameloop')
-rw-r--r-- | mwe/gameloop/include/gameObject.h | 53 | ||||
-rw-r--r-- | mwe/gameloop/include/timer.h | 31 | ||||
-rw-r--r-- | mwe/gameloop/src/loopManager.cpp | 97 | ||||
-rw-r--r-- | mwe/gameloop/src/main.cpp | 2 | ||||
-rw-r--r-- | mwe/gameloop/src/timer.cpp | 86 |
5 files changed, 150 insertions, 119 deletions
diff --git a/mwe/gameloop/include/gameObject.h b/mwe/gameloop/include/gameObject.h index 69f4d52..fc7d026 100644 --- a/mwe/gameloop/include/gameObject.h +++ b/mwe/gameloop/include/gameObject.h @@ -1,31 +1,30 @@ #pragma once #include <iostream> class GameObject { -public: - GameObject(); - GameObject(std::string name, float x, float y, float width, float height, - float velX, float velY); - std::string getName() const; - float getX() const; - float getY() const; - float getWidth() const; - float getHeight() const; - float getVelX() const; - float getVelY() const; - void setName(std::string value); - void setX(float value); - void setY(float value); - void setWidth(float value); - void setHeight(float value); - void setVelX(float value); - void setVelY(float value); - -private: - std::string name = ""; - float x = 0; - float y = 0; - float width = 0; - float height = 0; - float velX = 0; - float velY = 0; + public: + GameObject(); + GameObject(std::string name, float x, float y, float width, float height, float velX, float velY); + std::string getName() const; + float getX() const; + float getY() const; + float getWidth() const; + float getHeight() const; + float getVelX() const; + float getVelY() const; + void setName(std::string value); + void setX(float value); + void setY(float value); + void setWidth(float value); + void setHeight(float value); + void setVelX(float value); + void setVelY(float value); + int direction; + private: + std::string name = ""; + float x = 0; + float y = 0; + float width = 0; + float height = 0; + float velX = 0; + float velY = 0; }; diff --git a/mwe/gameloop/include/timer.h b/mwe/gameloop/include/timer.h index 22383b2..ca1e5f3 100644 --- a/mwe/gameloop/include/timer.h +++ b/mwe/gameloop/include/timer.h @@ -4,28 +4,29 @@ class LoopTimer { public: - static LoopTimer & getInstance(); - void start(); - void update(); - double getDeltaTime() const; - int getCurrentTime() const; + static LoopTimer& getInstance(); + void start(); + void update(); + double getDeltaTime() const; + int getCurrentTime() const; void advanceFixedUpdate(); double getFixedDeltaTime() const; - void setFPS(int FPS); - int getFPS() const; - void enforceFrameRate(); + void setFPS(int FPS); + int getFPS() const; + double getGameScale(); + void setGameScale(double); + void enforceFrameRate(); double getLag() const; - private: - LoopTimer(); + LoopTimer(); int FPS = 50; double gameScale = 1; double maximumDeltaTime = 0.25; - double deltaTime; + double deltaTime; double frameTargetTime = FPS / 1000; - double fixedDeltaTime = 0.01; - double elapsedTime; - double elapsedFixedTime; + double fixedDeltaTime = 0.01; + double elapsedTime; + double elapsedFixedTime; double time; - uint64_t lastFrameTime; + uint64_t lastFrameTime; }; diff --git a/mwe/gameloop/src/loopManager.cpp b/mwe/gameloop/src/loopManager.cpp index cb532cc..dde3cef 100644 --- a/mwe/gameloop/src/loopManager.cpp +++ b/mwe/gameloop/src/loopManager.cpp @@ -1,69 +1,92 @@ #include "loopManager.h" #include "timer.h" -LoopManager::LoopManager() {} -void LoopManager::processInput() { +LoopManager::LoopManager(){ +} +void LoopManager::processInput(){ SDL_Event event; SDL_PollEvent(&event); - switch (event.type) { + switch(event.type){ case SDL_QUIT: gameRunning = false; break; case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_ESCAPE) { + if(event.key.keysym.sym == SDLK_ESCAPE){ gameRunning = false; + }else if(event.key.keysym.sym == SDLK_i){ + LoopTimer::getInstance().setGameScale(LoopTimer::getInstance().getGameScale() + 0.1); + }else if(event.key.keysym.sym == SDLK_k){ + LoopTimer::getInstance().setGameScale(LoopTimer::getInstance().getGameScale() - 0.1); } - break; + + break; } } -void LoopManager::fixedUpdate() { fprintf(stderr, "fixed update\n"); } +void LoopManager::fixedUpdate(){ + fprintf(stderr,"fixed update\n"); +} void LoopManager::loop() { - LoopTimer & timer = LoopTimer::getInstance(); - timer.start(); + LoopTimer& timer = LoopTimer::getInstance(); + timer.start(); - while (gameRunning) { - timer.update(); + while (gameRunning) { + timer.update(); - while (timer.getLag() >= timer.getFixedDeltaTime()) { - processInput(); - fixedUpdate(); - timer.advanceFixedUpdate(); - } + while (timer.getLag() >= timer.getFixedDeltaTime()) { + processInput(); + fixedUpdate(); + timer.advanceFixedUpdate(); + } - update(); - render(); + update(); + render(); - timer.enforceFrameRate(); - } + timer.enforceFrameRate(); + } - window.destroyWindow(); + window.destroyWindow(); } -void LoopManager::setup() { +void LoopManager::setup(){ gameRunning = window.initWindow(); LoopTimer::getInstance().start(); - LoopTimer::getInstance().setFPS(50); - - for (int i = 0; i < 2; i++) { - GameObject * square - = new GameObject("square2", i * 40, i * 40, 20, 20, 0, 0); + LoopTimer::getInstance().setFPS(500); + + for(int i = 1; i < 3;i++){ + GameObject* square = new GameObject("square2",i*60,i*60,20,20,0,0); objectList.push_back(square); } } -void LoopManager::render() { - fprintf(stderr, "**********render********** \n"); - if (gameRunning) { +void LoopManager::render(){ + fprintf(stderr,"**********render********** \n"); + if(gameRunning){ window.render(objectList); } } void LoopManager::update() { - fprintf(stderr, "**********normal update********** \n"); - LoopTimer & timer = LoopTimer::getInstance(); + fprintf(stderr, "********** normal update ********** \n"); + LoopTimer& timer = LoopTimer::getInstance(); + + float delta = timer.getDeltaTime(); + for (int i = 0; i < objectList.size(); i++) { + GameObject* obj = objectList[i]; + + // Move the object based on its direction + if (obj->direction == 1) { + obj->setX(obj->getX() + 50 * delta); + } else { + obj->setX(obj->getX() - 50 * delta); + } + - float delta = timer.getDeltaTime(); - - for (int i = 0; i < objectList.size(); i++) { - objectList[i]->setX(objectList[i]->getX() + 50 * delta); - objectList[i]->setY(objectList[i]->getY() + 50 * delta); - } + if (obj->getX() > 500) { + obj->setX(500); + obj->direction = 0; // Switch direction to left + } else if (obj->getX() < 50) { + obj->setX(50); // Clamp the position to the boundary + obj->direction = 1; // Switch direction to right + } + } } + + diff --git a/mwe/gameloop/src/main.cpp b/mwe/gameloop/src/main.cpp index 889a30a..9f407c4 100644 --- a/mwe/gameloop/src/main.cpp +++ b/mwe/gameloop/src/main.cpp @@ -4,9 +4,7 @@ //#include "window.h" #include "loopManager.h" #include "timer.h" -//Screen dimension constants -//Starts up SDL and creates window int main(int argc, char * args[]) { LoopManager gameLoop; diff --git a/mwe/gameloop/src/timer.cpp b/mwe/gameloop/src/timer.cpp index 61e144d..03fb9eb 100644 --- a/mwe/gameloop/src/timer.cpp +++ b/mwe/gameloop/src/timer.cpp @@ -1,58 +1,68 @@ #include "timer.h" +LoopTimer::LoopTimer(){} -// Constructor (private) -LoopTimer::LoopTimer() {} - -// Get the singleton instance of the timer -LoopTimer & LoopTimer::getInstance() { - static LoopTimer instance; - return instance; +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; + 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; - } + uint64_t currentFrameTime = SDL_GetTicks64(); + deltaTime = (currentFrameTime - lastFrameTime) / 1000.0; - elapsedTime += deltaTime; - lastFrameTime = currentFrameTime; + if (deltaTime > maximumDeltaTime) { + deltaTime = maximumDeltaTime; + } + deltaTime *= gameScale; + elapsedTime += deltaTime; + lastFrameTime = currentFrameTime; } -double LoopTimer::getDeltaTime() const { return deltaTime; } -int LoopTimer::getCurrentTime() const { return SDL_GetTicks(); } +double LoopTimer::getDeltaTime() const { + return deltaTime; +} +int LoopTimer::getCurrentTime() const { + return SDL_GetTicks(); +} -void LoopTimer::advanceFixedUpdate() { elapsedFixedTime += fixedDeltaTime; } +void LoopTimer::advanceFixedUpdate() { + elapsedFixedTime += fixedDeltaTime; +} -double LoopTimer::getFixedDeltaTime() const { return fixedDeltaTime; } +double LoopTimer::getFixedDeltaTime() const { + return fixedDeltaTime; +} void LoopTimer::setFPS(int FPS) { - this->FPS = FPS; - frameTargetTime = 1.0 / FPS; + this->FPS = FPS; + frameTargetTime = 1.0 / FPS; } -int LoopTimer::getFPS() const { return FPS; } - +int LoopTimer::getFPS() const { + return FPS; +} +void LoopTimer::setGameScale(double value){ + gameScale = value; +}; +double LoopTimer::getGameScale(){ + return gameScale; +} void LoopTimer::enforceFrameRate() { - uint64_t currentFrameTime = SDL_GetTicks64(); - double frameDuration = (currentFrameTime - lastFrameTime) / 1000.0; + 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); - } + if (frameDuration < frameTargetTime) { + uint32_t delayTime = (uint32_t)((frameTargetTime - frameDuration) * 1000.0); + SDL_Delay(delayTime); + } +} +double LoopTimer::getLag() const { + return elapsedTime - elapsedFixedTime; } -double LoopTimer::getLag() const { return elapsedTime - elapsedFixedTime; } |