From 862090b43fe71895ee9cd870a8ecbf642bb51837 Mon Sep 17 00:00:00 2001 From: PolishPigeon Date: Fri, 21 Jan 2022 06:56:16 +0100 Subject: [PATCH] feat: Fixed time steps --- SFMLEngine/makingAGameTick/app | Bin 25360 -> 29928 bytes SFMLEngine/makingAGameTick/constants.hpp | 8 ++++-- SFMLEngine/makingAGameTick/game.cpp | 30 ++++++++++++++++++----- SFMLEngine/makingAGameTick/game.o | Bin 19840 -> 21448 bytes 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/SFMLEngine/makingAGameTick/app b/SFMLEngine/makingAGameTick/app index 66a48a2ce48d53bf27f239008d3c8fec0fe6b69a..0c44f14f40a784b1e79cda476085a73baf860876 100755 GIT binary patch literal 29928 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 Z0ad + // Player constants const float PLAYER_RADIUS = 40; const float PLAYER_X_POSITION = 100; @@ -11,9 +12,12 @@ const sf::Color PLAYER_COLOR = sf::Color::Cyan; // Movement constants // const sf::Vector2f INITIAL_MOVEMENT (0.f, 0.f); -const float MOVING_UP_SPEED = -0.01; +const float MOVING_UP_SPEED = -100; const float MOVING_DOWN_SPEED = -MOVING_UP_SPEED; -const float MOVING_RIGHT_SPEED = 0.01; +const float MOVING_RIGHT_SPEED = 100; const float MOVING_LEFT_SPEED = -MOVING_RIGHT_SPEED; +// Time constants +const sf::Time TIME_PER_FRAME = sf::seconds(1.f / 60.f); // 1 frame is 1 / 60 of the second so we get 60 frames in a second + #endif // CONSTANTS_HPP diff --git a/SFMLEngine/makingAGameTick/game.cpp b/SFMLEngine/makingAGameTick/game.cpp index c5f5111..1f61da6 100644 --- a/SFMLEngine/makingAGameTick/game.cpp +++ b/SFMLEngine/makingAGameTick/game.cpp @@ -11,7 +11,7 @@ class Game private: void processEvents(); // playerInput, mainLoop - void update(); // code that updates the game + void update(sf::Time deltaTime); // code that updates the game void render(); // code that renders the game void handlePlayerInput(sf::Keyboard::Key key, bool isPressed); bool mIsMovingUp = false; @@ -32,10 +32,25 @@ Game::Game() : mWindow(sf::VideoMode(640, 480), "SFML Application"), mPlayer() void Game::run() { - while (mWindow.isOpen()) + /* Other useful frame rate related tecnhiques: + sf::sleep - interrupts the execution for a given time, not very accurate + sf::RenderWindow::setFramerateLimit() - tries to achieve the frame rate by calling sf::sleep, nice for testing purposes + sf::RenderWindow::setVerticalSyncEnabled() - enables V-sync which adapts the rate of graphical updates from sf::RenderWindow::display() to the refresh rate of the monitor + */ + sf::Clock clock; + sf::Time timeSinceLastUpdateFunction = sf::Time::Zero; + while (mWindow.isOpen()) // this loop calls the render method { processEvents(); - update(); + timeSinceLastUpdateFunction += clock.restart(); + while(timeSinceLastUpdateFunction > TIME_PER_FRAME) // fixed time stamps + // this loop collects user input and computes game logic + { + timeSinceLastUpdateFunction -= TIME_PER_FRAME; + processEvents(); + update(TIME_PER_FRAME); + } + render(); } } @@ -79,13 +94,16 @@ void Game::processEvents() } } -void Game::update() +void Game::update(sf::Time deltaTime) { - sf::Vector2f movement (0.f, 0.f); + sf::Vector2f movement (0.f, 0.f); // movement from the origin of the current coordinate system, in this case origin is the shape's positon movement.y += mIsMovingUp * MOVING_UP_SPEED + mIsMovingDown * MOVING_DOWN_SPEED; movement.x += mIsMovingLeft * MOVING_LEFT_SPEED + mIsMovingRight * MOVING_RIGHT_SPEED; - mPlayer.move(movement); + mPlayer.move(movement * deltaTime.asSeconds()); + // from physics formula distance = speed * time + // this allows us to move exactly the distance we want it to move in one second, no matter what computer are we on + // delta time / time step - time that has elapsed since the last frame } diff --git a/SFMLEngine/makingAGameTick/game.o b/SFMLEngine/makingAGameTick/game.o index 00e8fab2d99967de754485fa2e1971344d6bb37c..deda2938929d0cb9de8a0f83ed7e6274984b3609 100644 GIT binary patch literal 21448 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 QJmi~c;ad;wlgTOn|HBV-LjV8(