Air-Trap 1.0.0
A multiplayer R-Type clone game engine built with C++23 and ECS architecture
Loading...
Searching...
No Matches
SettingsScene.cpp
Go to the documentation of this file.
1
9#include <vector>
10#include <string>
11#include <algorithm>
12
13namespace rtp::client {
14 namespace scenes {
15
17 // Public API
19
21 Settings& settings,
22 TranslationManager& translationManager,
23 NetworkSyncSystem& network,
24 graphics::UiFactory& uiFactory,
25 std::function<void(GameState)> changeState)
26 : _uiRegistry(UiRegistry),
27 _settings(settings),
28 _translationManager(translationManager),
29 _network(network),
30 _uiFactory(uiFactory),
31 _changeState(changeState)
32 {
33 }
34
36 {
37 log::info("Entering SettingsScene");
38 float yPos = 120.0f;
39
42 {540.0f, 30.0f},
43 _translationManager.get("settings.title"),
44 "assets/fonts/main.ttf",
45 50,
46 10,
47 {255, 200, 100}
48 );
49
52 {240.0f, yPos},
53 _translationManager.get("settings.master_volume"),
54 "assets/fonts/main.ttf",
55 22
56 );
57
60 {540.0f, yPos + 3.0f},
61 {300.0f, 15.0f},
62 0.0f,
63 1.0f,
65 [this](float value) {
67 }
68 );
69
70 yPos += 45.0f;
71
74 {240.0f, yPos},
75 _translationManager.get("settings.music_volume"),
76 "assets/fonts/main.ttf",
77 22
78 );
79
82 {540.0f, yPos + 3.0f},
83 {300.0f, 15.0f},
84 0.0f,
85 1.0f,
87 [this](float value) {
89 }
90 );
91
92 yPos += 45.0f;
93
96 {290.0f, yPos},
97 _translationManager.get("settings.sfx_volume"),
98 "assets/fonts/main.ttf",
99 22
100 );
101
104 {540.0f, yPos + 3.0f},
105 {300.0f, 15.0f},
106 0.0f,
107 1.0f,
109 [this](float value) {
110 _settings.setSfxVolume(value);
111 }
112 );
113
114 yPos += 60.0f;
115
118 {240.0f, yPos},
119 _translationManager.get("settings.language"),
120 "assets/fonts/main.ttf",
121 22
122 );
123
126 {540.0f, yPos},
127 {300.0f, 35.0f},
128 std::vector<std::string>{"English", "Français", "Español", "Deutsch", "Italiano"},
129 static_cast<int>(_settings.getLanguage()),
130 [this](int index) {
131 _settings.setLanguage(static_cast<Language>(index));
132 // Don't reload language here - it will destroy UI while callback is executing
133 log::info("Language changed to: {}. Changes will apply on next scene load.", index);
134 }
135 );
136
137 yPos += 55.0f;
138
141 {240.0f, yPos},
142 _translationManager.get("settings.colorblind_mode"),
143 "assets/fonts/main.ttf",
144 22
145 );
146
147 std::vector<std::string> colorblindOptions = {
148 _translationManager.get("colorblind.none"),
149 _translationManager.get("colorblind.protanopia"),
150 _translationManager.get("colorblind.deuteranopia"),
151 _translationManager.get("colorblind.tritanopia")
152 };
153
156 {540.0f, yPos},
157 {300.0f, 35.0f},
158 colorblindOptions,
159 static_cast<int>(_settings.getColorBlindMode()),
160 [this, colorblindOptions = colorblindOptions](int index) {
162 static_cast<ColorBlindMode>(index));
163 }
164 );
165
166 yPos += 55.0f;
167
170 {240.0f, yPos},
171 _translationManager.get("settings.difficulty"),
172 "assets/fonts/main.ttf",
173 22
174 );
175
176 std::vector<std::string> difficultyOptions = {
177 _translationManager.get("settings.easy"),
178 _translationManager.get("settings.normal"),
179 _translationManager.get("settings.hard"),
180 _translationManager.get("settings.infernal")
181 };
184 {540.0f, yPos},
185 {300.0f, 35.0f},
186 difficultyOptions,
187 static_cast<int>(_settings.getDifficulty()),
188 [this, difficultyOptions = difficultyOptions](int index) {
189 _settings.setDifficulty(static_cast<Difficulty>(index));
190 log::info("Solo difficulty set to: {}", difficultyOptions[index]);
191 }
192 );
193
194 yPos += 55.0f;
195
198 {490.0f, yPos},
199 {300.0f, 50.0f},
200 _translationManager.get("settings.key_bindings"),
201 [this]() {
203 }
204 );
205
206 // Petit bouton carré pour les settings gamepad à droite du bouton Key Bindings
209 {810.0f, yPos},
210 {60.0f, 50.0f},
211 "[GP]", // Gamepad
212 [this]() {
214 }
215 );
216
217 yPos += 65.0f;
218
221 {490.0f, yPos},
222 {300.0f, 50.0f},
223 _translationManager.get("settings.back"),
224 [this]() {
225 _settings.save();
228 }
229 );
230 }
231
233 {
234 // Reload language when exiting settings to apply changes
236 }
237
238 void SettingsScene::handleEvent(const sf::Event& e)
239 {
240 if (const auto* kp = e.getIf<sf::Event::KeyPressed>()) {
241 if (kp->code == sf::Keyboard::Key::Escape) {
243 }
244 }
245 }
246
248 {
249 (void)dt;
250 }
251 } // namespace scenes
252} // namespace rtp::client
System to handle network-related operations on the client side.
Manages game settings and preferences.
Definition Settings.hpp:67
void setDifficulty(Difficulty difficulty)
Definition Settings.hpp:155
Language getLanguage() const
Definition Settings.hpp:113
void setMusicVolume(float volume)
Definition Settings.cpp:237
float getMusicVolume() const
Definition Settings.hpp:82
Difficulty getDifficulty() const
Definition Settings.hpp:150
ColorBlindMode getColorBlindMode() const
Definition Settings.hpp:128
void setSfxVolume(float volume)
Definition Settings.cpp:246
void setLanguage(Language lang)
Definition Settings.cpp:255
float getMasterVolume() const
Definition Settings.hpp:75
void setColorBlindMode(ColorBlindMode mode)
Definition Settings.hpp:133
bool save(const std::string &filename="config/settings.cfg")
Definition Settings.cpp:339
void setMasterVolume(float volume)
Definition Settings.cpp:228
float getSfxVolume() const
Definition Settings.hpp:89
Manages game translations for all UI elements.
std::string get(const std::string &key) const
Get translated string for a key.
bool loadLanguage(Language language)
Load translations for a specific language.
Factory class for creating UI components in the ECS registry.
Definition UiFactory.hpp:72
static ecs::Entity createText(ecs::Registry &registry, const position &position, const std::string &content, const std::string &fontPath, unsigned int fontSize, const std::uint8_t zIndex=0, const color &textColor={255, 255, 255})
Definition UiFactory.cpp:43
static ecs::Entity createButton(ecs::Registry &registry, const position &position, const size &size, const std::string &label, std::function< void()> onClick=nullptr)
Create a button UI component.
Definition UiFactory.cpp:17
static ecs::Entity createDropdown(ecs::Registry &registry, const position &position, const size &size, const std::vector< std::string > &options, const int selectedIndex, std::function< void(int index)> onSelect=nullptr)
static ecs::Entity createSlider(ecs::Registry &registry, const position &position, const size &size, float minValue, float maxValue, float initialValue, std::function< void(float)> onChange=nullptr)
Definition UiFactory.cpp:75
ecs::Registry & _uiRegistry
Reference to the ECS registry.
void update(float dt) override
Update the scene state.
ChangeStateFn _changeState
Function to change the game state.
SettingsScene(ecs::Registry &UiRegistry, Settings &settings, TranslationManager &translationManager, NetworkSyncSystem &network, graphics::UiFactory &uiFactory, std::function< void(GameState)> changeState)
Constructor for SettingsScene.
TranslationManager & _translationManager
Reference to the translation manager.
void onExit() override
Called when the scene is exited.
Settings & _settings
Reference to the application settings.
void handleEvent(const sf::Event &event) override
Handle an incoming event.
void onEnter() override
Called when the scene is entered.
graphics::UiFactory & _uiFactory
UI Factory for creating UI components.
R-Type client namespace.
ColorBlindMode
Color blind assistance modes.
Definition Settings.hpp:45
Difficulty
Game difficulty levels (solo mode only)
Definition Settings.hpp:56
@ GamepadSettings
Gamepad settings configuration state.
@ Menu
Main menu state.
@ KeyBindings
Key bindings configuration state.
Language
Supported languages.
Definition Settings.hpp:33
void info(LogFmt< std::type_identity_t< Args >... > fmt, Args &&...args) noexcept
Log an informational message.