From b929b26e4a63d3d2de87885a89a189cd04b9fb5b Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sun, 19 Nov 2023 14:13:29 +0100 Subject: [PATCH] Implement turbo mode --- include/scratchcpp/iengine.h | 6 ++++++ src/engine/internal/engine.cpp | 12 +++++++++++- src/engine/internal/engine.h | 8 ++++++-- test/engine/engine_test.cpp | 17 +++++++++++++++++ test/mocks/enginemock.h | 3 +++ 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/include/scratchcpp/iengine.h b/include/scratchcpp/iengine.h index f1b74c76..33df54b4 100644 --- a/include/scratchcpp/iengine.h +++ b/include/scratchcpp/iengine.h @@ -99,6 +99,12 @@ class LIBSCRATCHCPP_EXPORT IEngine /*! Sets the framerate of the project. */ virtual void setFps(double fps) = 0; + /*! Returns true if turbo mode is enabled. */ + virtual bool turboModeEnabled() const = 0; + + /*! Sets whether turbo mode is enabled. */ + virtual void setTurboModeEnabled(bool turboMode) = 0; + /*! Returns true if the given key is pressed. */ virtual bool keyPressed(const std::string &name) const = 0; diff --git a/src/engine/internal/engine.cpp b/src/engine/internal/engine.cpp index 8fe03d91..f5c3e0d7 100644 --- a/src/engine/internal/engine.cpp +++ b/src/engine/internal/engine.cpp @@ -368,7 +368,7 @@ void Engine::eventLoop(bool untilProjectStops) elapsedTime = std::chrono::duration_cast(currentTime - frameStart); sleepTime = m_frameDuration - elapsedTime; timeout = sleepTime <= std::chrono::milliseconds::zero(); - } while (!m_redrawRequested && !timeout && !stop); + } while (!((m_redrawRequested && !m_turboModeEnabled) || timeout || stop)); if (stop) break; @@ -477,6 +477,16 @@ void Engine::setFps(double fps) updateFrameDuration(); } +bool Engine::turboModeEnabled() const +{ + return m_turboModeEnabled; +} + +void Engine::setTurboModeEnabled(bool turboMode) +{ + m_turboModeEnabled = turboMode; +} + bool Engine::keyPressed(const std::string &name) const { if (name == "any") { diff --git a/src/engine/internal/engine.h b/src/engine/internal/engine.h index c59b421e..d8734141 100644 --- a/src/engine/internal/engine.h +++ b/src/engine/internal/engine.h @@ -45,6 +45,9 @@ class Engine : public IEngine double fps() const override; void setFps(double fps) override; + bool turboModeEnabled() const override; + void setTurboModeEnabled(bool turboMode) override; + bool keyPressed(const std::string &name) const override; void setKeyState(const std::string &name, bool pressed) override; void setAnyKeyPressed(bool pressed) override; @@ -161,8 +164,9 @@ class Engine : public IEngine std::unique_ptr m_defaultTimer; ITimer *m_timer = nullptr; - double m_fps = 30; // default FPS - std::chrono::milliseconds m_frameDuration; // will be computed in eventLoop() + double m_fps = 30; // default FPS + std::chrono::milliseconds m_frameDuration; // will be computed in eventLoop() + bool m_turboModeEnabled = false; std::unordered_map m_keyMap; // holds key states bool m_anyKeyPressed = false; double m_mouseX = 0; diff --git a/test/engine/engine_test.cpp b/test/engine/engine_test.cpp index 8682d36d..1f0cc6da 100644 --- a/test/engine/engine_test.cpp +++ b/test/engine/engine_test.cpp @@ -114,6 +114,23 @@ TEST(EngineTest, FpsProject) EXPECT_CALL(clock, sleep(std::chrono::milliseconds(100))); EXPECT_CALL(clock, sleep(std::chrono::milliseconds(15))); p.run(); + + engine->setTurboModeEnabled(true); + EXPECT_CALL(clock, currentSteadyTime()).WillOnce(Return(time5)).WillOnce(Return(time5)).WillOnce(Return(time6)).WillOnce(Return(time6)).WillOnce(Return(time7)).WillOnce(Return(time8)); + EXPECT_CALL(clock, sleep).Times(0); + p.run(); +} + +TEST(EngineTest, TurboModeEnabled) +{ + Engine engine; + ASSERT_FALSE(engine.turboModeEnabled()); + + engine.setTurboModeEnabled(true); + ASSERT_TRUE(engine.turboModeEnabled()); + + engine.setTurboModeEnabled(false); + ASSERT_FALSE(engine.turboModeEnabled()); } TEST(EngineTest, ExecutionOrder) diff --git a/test/mocks/enginemock.h b/test/mocks/enginemock.h index 25c891c1..90f6f793 100644 --- a/test/mocks/enginemock.h +++ b/test/mocks/enginemock.h @@ -31,6 +31,9 @@ class EngineMock : public IEngine MOCK_METHOD(double, fps, (), (const, override)); MOCK_METHOD(void, setFps, (double fps), (override)); + MOCK_METHOD(bool, turboModeEnabled, (), (const, override)); + MOCK_METHOD(void, setTurboModeEnabled, (bool), (override)); + MOCK_METHOD(bool, keyPressed, (const std::string &), (const, override)); MOCK_METHOD(void, setKeyState, (const std::string &, bool), (override)); MOCK_METHOD(void, setAnyKeyPressed, (bool), (override));