summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVittorio Romeo <vittorio.romeo@outlook.com>2021-10-31 18:02:11 +0000
committerVittorio Romeo <vittorio.romeo@outlook.com>2021-10-31 18:02:11 +0000
commitbbaba4cf63fe660105d93194cff19478af49520d (patch)
tree28bb131e7fabe7687a358ef0af2cce52f4667dd7
parenta25ec9b311195fb457da864e43868ffba1fa9abc (diff)
Rewrite camera shake effect code
-rw-r--r--include/SSVOpenHexagon/Core/HexagonGame.hpp17
-rw-r--r--src/SSVOpenHexagon/Core/HGUpdate.cpp43
-rw-r--r--src/SSVOpenHexagon/Utils/Utils.cpp23
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