diff options
author | Vittorio Romeo <vittorio.romeo@outlook.com> | 2021-11-09 16:52:56 +0000 |
---|---|---|
committer | Vittorio Romeo <vittorio.romeo@outlook.com> | 2021-11-09 16:52:56 +0000 |
commit | 806561e48017f4dabfae85dec45b990c44b1c71b (patch) | |
tree | a16926158ec731e81e02f65978474ae8cad879e1 | |
parent | b71c3a7d7ebec60b8d919400ac7752f9509d9b06 (diff) |
Add player trail visual FX
-rw-r--r-- | _RELEASE/config.json | 4 | ||||
-rw-r--r-- | include/SSVOpenHexagon/Core/HGStatus.hpp | 1 | ||||
-rw-r--r-- | include/SSVOpenHexagon/Core/HexagonGame.hpp | 19 | ||||
-rw-r--r-- | include/SSVOpenHexagon/Global/Config.hpp | 10 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/HGGraphics.cpp | 13 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/HGUpdate.cpp | 78 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/HexagonGame.cpp | 3 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/LuaScripting.cpp | 6 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/MenuGame.cpp | 18 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Global/Config.cpp | 55 |
10 files changed, 192 insertions, 15 deletions
diff --git a/_RELEASE/config.json b/_RELEASE/config.json index 9bc31cef..eb793cac 100644 --- a/_RELEASE/config.json +++ b/_RELEASE/config.json @@ -50,6 +50,9 @@ "player_focus_speed" : 4.6250,
"player_size" : 7.300000190734863,
"player_speed" : 9.449999809265137,
+ "player_trail_alpha" : 255,
+ "player_trail_decay" : 0.50,
+ "player_trail_scale" : 1.0,
"pulse_enabled" : true,
"rotate_to_start" : false,
"save_last_login_username" : true,
@@ -131,6 +134,7 @@ "show_level_info" : true,
"show_login_at_startup" : false,
"show_messages" : true,
+ "show_player_trail" : true,
"show_status_text" : true,
"show_timer" : true,
"show_tracked_variables" : true,
diff --git a/include/SSVOpenHexagon/Core/HGStatus.hpp b/include/SSVOpenHexagon/Core/HGStatus.hpp index 06e79a63..b5c54f0c 100644 --- a/include/SSVOpenHexagon/Core/HGStatus.hpp +++ b/include/SSVOpenHexagon/Core/HGStatus.hpp @@ -58,6 +58,7 @@ public: bool started{false}; std::string restartInput; std::string replayInput; + bool showPlayerTrail{true}; // Reset all the time points and signal that we started void start() noexcept; diff --git a/include/SSVOpenHexagon/Core/HexagonGame.hpp b/include/SSVOpenHexagon/Core/HexagonGame.hpp index 243467e0..74d7dedc 100644 --- a/include/SSVOpenHexagon/Core/HexagonGame.hpp +++ b/include/SSVOpenHexagon/Core/HexagonGame.hpp @@ -167,21 +167,24 @@ private: ssvs::VertexVector<sf::PrimitiveType::Quads> flashPolygon{4}; - enum class ParticleType : std::uint8_t - { - Normal, - Trail - }; - struct Particle { sf::Sprite sprite; sf::Vector2f velocity; float angularVelocity; - ParticleType type; }; + struct TrailParticle + { + sf::Sprite sprite; + float angle; + }; + + sf::Texture& txStarParticle; + sf::Texture& txSmallCircle; + std::vector<Particle> particles; + std::vector<TrailParticle> trailParticles; bool mustSpawnPBParticles{false}; float nextPBParticleSpawn{0.f}; float pbTextGrowth{0.f}; @@ -340,6 +343,7 @@ private: void updateKeyIcons(); void updateLevelInfo(); void updateParticles(ssvu::FT mFT); + void updateTrailParticles(ssvu::FT mFT); // Post update methods void postUpdate(); @@ -360,6 +364,7 @@ private: void drawKeyIcons(); void drawLevelInfo(); void drawParticles(); + void drawTrailParticles(); void drawImguiLuaConsole(); // Data-related methods diff --git a/include/SSVOpenHexagon/Global/Config.hpp b/include/SSVOpenHexagon/Global/Config.hpp index 0ed86863..a3916f3f 100644 --- a/include/SSVOpenHexagon/Global/Config.hpp +++ b/include/SSVOpenHexagon/Global/Config.hpp @@ -84,6 +84,11 @@ void setLastLoginUsername(const std::string& mX); void setShowLoginAtStartup(bool mX); void setCameraShakeMultiplier(float x); void setAngleTiltIntensity(float x); +void setShowPlayerTrail(bool mX); +void setPlayerTrailAlpha(unsigned int x); +void setPlayerTrailScale(float x); +void setPlayerTrailDecay(float x); +void setPlayerTrailHasSwapColor(bool x); [[nodiscard]] bool getOfficial(); [[nodiscard]] const std::string& getUneligibilityReason(); @@ -152,6 +157,11 @@ void setAngleTiltIntensity(float x); [[nodiscard]] bool getShowLoginAtStartup(); [[nodiscard]] float getCameraShakeMultiplier(); [[nodiscard]] float getAngleTiltIntensity(); +[[nodiscard]] bool getShowPlayerTrail(); +[[nodiscard]] unsigned int getPlayerTrailAlpha(); +[[nodiscard]] float getPlayerTrailScale(); +[[nodiscard]] float getPlayerTrailDecay(); +[[nodiscard]] bool getPlayerTrailHasSwapColor(); // keyboard binds diff --git a/src/SSVOpenHexagon/Core/HGGraphics.cpp b/src/SSVOpenHexagon/Core/HGGraphics.cpp index ea31c1e3..15e46fbe 100644 --- a/src/SSVOpenHexagon/Core/HGGraphics.cpp +++ b/src/SSVOpenHexagon/Core/HGGraphics.cpp @@ -226,6 +226,11 @@ void HexagonGame::draw() } } + if(Config::getShowPlayerTrail() && status.showPlayerTrail) + { + drawTrailParticles(); + } + render(wallQuads3D); render(pivotQuads3D); render(playerTris3D); @@ -357,6 +362,14 @@ void HexagonGame::drawParticles() } } +void HexagonGame::drawTrailParticles() +{ + for(TrailParticle& p : trailParticles) + { + render(p.sprite); + } +} + void HexagonGame::updateText(ssvu::FT mFT) { if(window == nullptr) diff --git a/src/SSVOpenHexagon/Core/HGUpdate.cpp b/src/SSVOpenHexagon/Core/HGUpdate.cpp index e90cae0a..7c160638 100644 --- a/src/SSVOpenHexagon/Core/HGUpdate.cpp +++ b/src/SSVOpenHexagon/Core/HGUpdate.cpp @@ -29,6 +29,10 @@ #include <SSVUtils/Core/Common/Frametime.hpp> #include <SSVUtils/Core/Utils/Containers.hpp> +#include <SFML/Config.hpp> +#include <SFML/Graphics/Color.hpp> +#include <SFML/System/Vector2.hpp> + #include <array> #include <cstring> #include <optional> @@ -333,6 +337,12 @@ void HexagonGame::update(ssvu::FT mFT, const float timescale) SSVOH_ASSERT(backgroundCamera.has_value()); updateParticles(mFT); + + if(Config::getShowPlayerTrail() && status.showPlayerTrail) + { + updateTrailParticles(mFT); + } + overlayCamera->update(mFT); backgroundCamera->update(mFT); } @@ -871,14 +881,11 @@ void HexagonGame::updateParticles(ssvu::FT mFT) pos.y < 0 - padding || pos.y > Config::getHeight() + padding); }; - const auto isDead = [&](const Particle& p) - { return p.sprite.getColor().a <= 0 || isOutOfBounds(p); }; - const auto makePBParticle = [this] { Particle p; - p.sprite.setTexture(assets.getTextureOrNullTexture("starParticle.png")); + p.sprite.setTexture(txStarParticle); p.sprite.setPosition( {ssvu::getRndR(-64.f, Config::getWidth() + 64.f), -64.f}); p.sprite.setRotation(ssvu::getRndR(0.f, 360.f)); @@ -896,7 +903,7 @@ void HexagonGame::updateParticles(ssvu::FT mFT) return p; }; - ssvu::eraseRemoveIf(particles, isDead); + ssvu::eraseRemoveIf(particles, isOutOfBounds); for(Particle& p : particles) { @@ -916,6 +923,67 @@ void HexagonGame::updateParticles(ssvu::FT mFT) } } +void HexagonGame::updateTrailParticles(ssvu::FT mFT) +{ + SSVOH_ASSERT(window != nullptr); + + const auto isDead = [&](const TrailParticle& p) + { return p.sprite.getColor().a <= 3; }; + + const auto makeTrailParticle = [this] + { + TrailParticle p; + + p.sprite.setTexture(txSmallCircle); + p.sprite.setPosition(player.getPosition()); + p.sprite.setOrigin(sf::Vector2f{txSmallCircle.getSize()} / 2.f); + + const float scale = Config::getPlayerTrailScale(); + p.sprite.setScale({scale, scale}); + + sf::Color c = Config::getPlayerTrailHasSwapColor() + ? player.getColorAdjustedForSwap(getColorPlayer()) + : getColorPlayer(); + + c.a = Config::getPlayerTrailAlpha(); + p.sprite.setColor(c); + + p.angle = player.getPlayerAngle(); + + return p; + }; + + ssvu::eraseRemoveIf(trailParticles, isDead); + + for(TrailParticle& p : trailParticles) + { + sf::Color color = p.sprite.getColor(); + auto alpha = static_cast<float>(color.a); + + if(alpha > 0.f) + { + alpha -= Config::getPlayerTrailDecay() * mFT; + if(alpha <= 0.f) + { + alpha = 0; + } + } + + color.a = static_cast<sf::Uint8>(alpha); + p.sprite.setColor(color); + + p.sprite.setScale(p.sprite.getScale() * 0.98f); + + p.sprite.setPosition( + ssvs::getVecFromRad(p.angle, status.radius + 2.4f)); + } + + if(player.hasChangedAngle()) + { + trailParticles.emplace_back(makeTrailParticle()); + } +} + static int ilcTextEditCallbackStub(ImGuiInputTextCallbackData* data) { auto hg = (HexagonGame*)data->UserData; diff --git a/src/SSVOpenHexagon/Core/HexagonGame.cpp b/src/SSVOpenHexagon/Core/HexagonGame.cpp index e8cd3c7f..215cc7a8 100644 --- a/src/SSVOpenHexagon/Core/HexagonGame.cpp +++ b/src/SSVOpenHexagon/Core/HexagonGame.cpp @@ -287,6 +287,8 @@ HexagonGame::HexagonGame(Steam::steam_manager* mSteamManager, levelStatus{Config::getMusicSpeedDMSync(), Config::getSpawnDistance()}, messageText{initText("", font, 38.f)}, pbText{initText("", fontBold, 65.f)}, + txStarParticle(assets.getTextureOrNullTexture("starParticle.png")), + txSmallCircle(assets.getTextureOrNullTexture("smallCircle.png")), levelInfoTextLevel{"", font}, levelInfoTextPack{"", font}, levelInfoTextAuthor{"", font}, @@ -665,6 +667,7 @@ void HexagonGame::newGame(const std::string& mPackId, const std::string& mId, mustSpawnPBParticles = false; nextPBParticleSpawn = 0.f; particles.clear(); + trailParticles.clear(); if(window != nullptr) { diff --git a/src/SSVOpenHexagon/Core/LuaScripting.cpp b/src/SSVOpenHexagon/Core/LuaScripting.cpp index b6d32580..7208dcfa 100644 --- a/src/SSVOpenHexagon/Core/LuaScripting.cpp +++ b/src/SSVOpenHexagon/Core/LuaScripting.cpp @@ -922,6 +922,12 @@ static void initLevelControl( "`0` and `l_getBeatPulseDelayMax()` unless manually overridden.", "Sets the current beat pulse delay value to `$0`."); + + sVar("ShowPlayerTrail", &HexagonGameStatus::showPlayerTrail, + "Gets whether the current level allows player trails to be shown.", + + "Sets whether the current level allows player trails to be shown to " + "`$0`."); } static void initStyleControl(Lua::LuaContext& lua, StyleData& styleData) diff --git a/src/SSVOpenHexagon/Core/MenuGame.cpp b/src/SSVOpenHexagon/Core/MenuGame.cpp index d73fbe79..2c667828 100644 --- a/src/SSVOpenHexagon/Core/MenuGame.cpp +++ b/src/SSVOpenHexagon/Core/MenuGame.cpp @@ -1394,9 +1394,21 @@ void MenuGame::initMenus() visfx.create<i::Toggle>("flash", &Config::getFlash, &Config::setFlash); visfx.create<i::Slider>("shake mult.", &Config::getCameraShakeMultiplier, &Config::setCameraShakeMultiplier, 0.f, 5.f, 0.1f); - visfx.create<i::Slider>("angle tilt mult.", &Config::getAngleTiltIntensity, - &Config::setAngleTiltIntensity, 0.f, 5.f, 0.1f); - visfx.create<i::GoBack>("back"); + + auto& playervisfx(optionsMenu.createCategory("player visual fxs")); + gfx.create<i::Goto>("player visual fxs", playervisfx); + playervisfx.create<i::Slider>("angle tilt mult.", + &Config::getAngleTiltIntensity, &Config::setAngleTiltIntensity, 0.f, + 5.f, 0.1f); + playervisfx.create<i::Toggle>( + "show trail", &Config::getShowPlayerTrail, &Config::setShowPlayerTrail); + playervisfx.create<i::Slider>("trail alpha", &Config::getPlayerTrailAlpha, + &Config::setPlayerTrailAlpha, 0, 255, 5); + playervisfx.create<i::Slider>("trail scale", &Config::getPlayerTrailScale, + &Config::setPlayerTrailScale, 0.05f, 1.f, 0.05f); + playervisfx.create<i::Slider>("trail decay", &Config::getPlayerTrailDecay, + &Config::setPlayerTrailDecay, 0.5f, 50.f, 2.5f); + playervisfx.create<i::GoBack>("back"); auto& fps(optionsMenu.createCategory("fps settings")); gfx.create<i::Goto>("fps settings", fps); diff --git a/src/SSVOpenHexagon/Global/Config.cpp b/src/SSVOpenHexagon/Global/Config.cpp index 9695ca7e..47a44b2f 100644 --- a/src/SSVOpenHexagon/Global/Config.cpp +++ b/src/SSVOpenHexagon/Global/Config.cpp @@ -216,6 +216,11 @@ using cil = std::initializer_list<cmb>; X(showLoginAtStartup, bool, "show_login_at_startup", false) \ X(cameraShakeMultiplier, float, "camera_shake_multiplier", 1.f) \ X(angleTiltIntensity, float, "angle_tilt_intensity", 1.f) \ + X(showPlayerTrail, bool, "show_player_trail", true) \ + X(playerTrailAlpha, uint, "player_trail_alpha", 180) \ + X(playerTrailScale, float, "player_trail_scale", 0.5f) \ + X(playerTrailDecay, float, "player_trail_decay", 10.f) \ + X(playerTrailHasSwapColor, bool, "player_trail_has_swap_color", true) \ X_LINKEDVALUES_BINDS namespace hg::Config { @@ -742,6 +747,31 @@ void setAngleTiltIntensity(float x) angleTiltIntensity() = x; } +void setShowPlayerTrail(bool x) +{ + showPlayerTrail() = x; +} + +void setPlayerTrailAlpha(unsigned int x) +{ + playerTrailAlpha() = x; +} + +void setPlayerTrailScale(float x) +{ + playerTrailScale() = x; +} + +void setPlayerTrailDecay(float x) +{ + playerTrailDecay() = x; +} + +void setPlayerTrailHasSwapColor(bool x) +{ + playerTrailHasSwapColor() = x; +} + [[nodiscard]] bool getOfficial() { return official(); @@ -1077,6 +1107,31 @@ void setAngleTiltIntensity(float x) return angleTiltIntensity(); } +[[nodiscard]] bool getShowPlayerTrail() +{ + return showPlayerTrail(); +} + +[[nodiscard]] unsigned int getPlayerTrailAlpha() +{ + return playerTrailAlpha(); +} + +[[nodiscard]] float getPlayerTrailScale() +{ + return playerTrailScale(); +} + +[[nodiscard]] float getPlayerTrailDecay() +{ + return playerTrailDecay(); +} + +[[nodiscard]] bool getPlayerTrailHasSwapColor() +{ + return playerTrailHasSwapColor(); +} + //*********************************************************** // // KEYBOARD/MOUSE BINDS |