diff options
author | Vittorio Romeo <vittorio.romeo@outlook.com> | 2021-10-31 18:02:11 +0000 |
---|---|---|
committer | Vittorio Romeo <vittorio.romeo@outlook.com> | 2021-10-31 18:02:11 +0000 |
commit | bbaba4cf63fe660105d93194cff19478af49520d (patch) | |
tree | 28bb131e7fabe7687a358ef0af2cce52f4667dd7 | |
parent | a25ec9b311195fb457da864e43868ffba1fa9abc (diff) |
Rewrite camera shake effect code
-rw-r--r-- | include/SSVOpenHexagon/Core/HexagonGame.hpp | 17 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/HGUpdate.cpp | 43 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Utils/Utils.cpp | 23 |
3 files changed, 57 insertions, 26 deletions
diff --git a/include/SSVOpenHexagon/Core/HexagonGame.hpp b/include/SSVOpenHexagon/Core/HexagonGame.hpp index 211eec36..55909b18 100644 --- a/include/SSVOpenHexagon/Core/HexagonGame.hpp +++ b/include/SSVOpenHexagon/Core/HexagonGame.hpp @@ -131,6 +131,15 @@ private: std::optional<ssvs::Camera> backgroundCamera; std::optional<ssvs::Camera> overlayCamera; + struct PreShakeCenters + { + sf::Vector2f backgroundCameraPreShakeCenter; + sf::Vector2f overlayCameraPreShakeCenter; + }; + + std::optional<PreShakeCenters> preShakeCenters; + + ssvu::TimelineManager effectTimelineManager; const sf::Vector2f centerPos{0.f, 0.f}; @@ -278,8 +287,8 @@ public: catch(...) { luaExceptionLippincottHandler(mName); - return decltype( - Utils::runLuaFunctionIfExists<T, TArgs...>(lua, mName, mArgs...)){}; + return decltype(Utils::runLuaFunctionIfExists<T, TArgs...>( + lua, mName, mArgs...)){}; } void raiseWarning( @@ -291,7 +300,7 @@ private: void start(); void initKeyIcons(); - void initFlashEffect(); + void initFlashEffect(int r, int g, int b); // Fast-forward std::optional<double> fastForwardTarget; @@ -317,6 +326,7 @@ private: void updatePulse(ssvu::FT mFT); void updateBeatPulse(ssvu::FT mFT); void updateRotation(ssvu::FT mFT); + void updateCameraShake(ssvu::FT mFT); void updateFlash(ssvu::FT mFT); void updatePulse3D(ssvu::FT mFT); void updateText(ssvu::FT mFT); @@ -417,6 +427,7 @@ public: void death(bool mForce = false); void death_shakeCamera(); + void death_flashEffect(); [[nodiscard]] replay_file death_createReplayFile(); void death_updateRichPresence(); [[nodiscard]] SaveScoreIfNeededResult death_saveScoreIfNeeded(); diff --git a/src/SSVOpenHexagon/Core/HGUpdate.cpp b/src/SSVOpenHexagon/Core/HGUpdate.cpp index 6882b77c..dff026fd 100644 --- a/src/SSVOpenHexagon/Core/HGUpdate.cpp +++ b/src/SSVOpenHexagon/Core/HGUpdate.cpp @@ -307,6 +307,8 @@ void HexagonGame::update(ssvu::FT mFT, const float timescale) updateRotation(mFT); } + updateCameraShake(mFT); + if(!status.hasDied) { const auto fixup = @@ -782,6 +784,47 @@ void HexagonGame::updateRotation(ssvu::FT mFT) } } +void HexagonGame::updateCameraShake(ssvu::FT mFT) +{ + if(!backgroundCamera.has_value() || !overlayCamera.has_value()) + { + return; + } + + if(status.cameraShake <= 0) + { + backgroundCamera->setCenter( + preShakeCenters->backgroundCameraPreShakeCenter); + + overlayCamera->setCenter(preShakeCenters->overlayCameraPreShakeCenter); + + preShakeCenters.reset(); + return; + } + + status.cameraShake -= mFT; + + if(!preShakeCenters.has_value()) + { + preShakeCenters = PreShakeCenters{ + backgroundCamera->getCenter(), overlayCamera->getCenter()}; + } + + SSVOH_ASSERT(preShakeCenters.has_value()); + + const auto makeShakeVec = [this] + { + const float i = status.cameraShake; + return sf::Vector2f(rng.get_real(-i, i), rng.get_real(-i, i)); + }; + + backgroundCamera->setCenter( + preShakeCenters->backgroundCameraPreShakeCenter + makeShakeVec()); + + overlayCamera->setCenter( + preShakeCenters->overlayCameraPreShakeCenter + makeShakeVec()); +} + void HexagonGame::updateFlash(ssvu::FT mFT) { if(status.flashEffect > 0) diff --git a/src/SSVOpenHexagon/Utils/Utils.cpp b/src/SSVOpenHexagon/Utils/Utils.cpp index 2f2a203b..120293dd 100644 --- a/src/SSVOpenHexagon/Utils/Utils.cpp +++ b/src/SSVOpenHexagon/Utils/Utils.cpp @@ -22,29 +22,6 @@ namespace hg::Utils { -void shakeCamera(ssvu::TimelineManager& mTimelineManager, ssvs::Camera& mCamera) -{ - constexpr int s{7}; - sf::Vector2f oldCenter{mCamera.getCenter()}; - ssvu::Timeline& timeline(mTimelineManager.create()); - - for(int i{s}; i > 0; --i) - { - timeline.append<ssvu::Do>( - [&mCamera, oldCenter, i] - { - mCamera.setCenter(oldCenter + sf::Vector2f(ssvu::getRndI(-i, i), - ssvu::getRndI(-i, i))); - }); - timeline.append<ssvu::Wait>(1); - timeline.append<ssvu::Go>(0, 3); - } - - timeline.append<ssvu::Do>( - [&mCamera, oldCenter] { mCamera.setCenter(oldCenter); }); -} - - void runLuaCode(Lua::LuaContext& mLua, const std::string& mCode) { try |