r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
configFlappy.cpp
Go to the documentation of this file.
1#include <cmath>
2
3#include "ECS/Component.hpp"
5#include "Utils/Common.hpp"
7
9{
10 switch (key)
11 {
12 case eng::Key::A:
13 return 'a';
14 case eng::Key::B:
15 return 'b';
16 case eng::Key::C:
17 return 'c';
18 case eng::Key::D:
19 return 'd';
20 case eng::Key::E:
21 return 'e';
22 case eng::Key::F:
23 return 'f';
24 case eng::Key::G:
25 return 'g';
26 case eng::Key::H:
27 return 'h';
28 case eng::Key::I:
29 return 'i';
30 case eng::Key::J:
31 return 'j';
32 case eng::Key::K:
33 return 'k';
34 case eng::Key::L:
35 return 'l';
36 case eng::Key::M:
37 return 'm';
38 case eng::Key::N:
39 return 'n';
40 case eng::Key::O:
41 return 'o';
42 case eng::Key::P:
43 return 'p';
44 case eng::Key::Q:
45 return 'q';
46 case eng::Key::R:
47 return 'r';
48 case eng::Key::S:
49 return 's';
50 case eng::Key::T:
51 return 't';
52 case eng::Key::U:
53 return 'u';
54 case eng::Key::V:
55 return 'v';
56 case eng::Key::W:
57 return 'w';
58 case eng::Key::X:
59 return 'x';
60 case eng::Key::Y:
61 return 'y';
62 case eng::Key::Z:
63 return 'z';
64 case eng::Key::Num0:
65 return '0';
66 case eng::Key::Num1:
67 return '1';
68 case eng::Key::Num2:
69 return '2';
70 case eng::Key::Num3:
71 return '3';
72 case eng::Key::Num4:
73 return '4';
74 case eng::Key::Num5:
75 return '5';
76 case eng::Key::Num6:
77 return '6';
78 case eng::Key::Num7:
79 return '7';
80 case eng::Key::Num8:
81 return '8';
82 case eng::Key::Num9:
83 return '9';
84 case eng::Key::Space:
85 return ' ';
86 default:
87 return '\0';
88 }
89}
90
92{
93 return m_playerName;
94}
95
97{
98 auto &reg = getRegistry();
99
100 if (auto *playerNameText = reg.getComponent<ecs::Text>(m_playerNameValueEntity))
101 {
102 playerNameText->content = m_playerName.empty() ? "Player" : m_playerName;
103 m_renderer->setTextContent("player_name_value", playerNameText->content);
104 }
105
106 if (auto *skinText = reg.getComponent<ecs::Text>(m_skinValueEntity))
107 {
108 skinText->content = std::to_string(m_skinIndex + 1);
109 m_renderer->setTextContent("skin_value", skinText->content);
110 }
111
112 if (auto *skinRect = reg.getComponent<ecs::Rect>(m_skinSpriteEntity))
113 {
114 const std::vector<float> shipLines = {0.0f, 17.0f, 34.0f, 51.0f};
115 if (m_skinIndex >= 0 && m_skinIndex < static_cast<int>(shipLines.size()))
116 {
117 const float skinPosY = shipLines[static_cast<size_t>(m_skinIndex)];
118 skinRect->pos_y = skinPosY;
119 skinRect->pos_x = 0.0f;
120 skinRect->size_x = 33U;
121 skinRect->size_y = 17U;
122 const std::string spriteName = "player_preview_texture" + std::to_string(m_skinSpriteEntity);
123 m_renderer->setSpriteFrame(spriteName, 0, static_cast<int>(skinPosY), 33, 17);
124 }
125 }
126}
127
128gme::ConfigFlappy::ConfigFlappy(const eng::id assignedId, const std::shared_ptr<eng::IRenderer> &renderer)
129 : AScene(assignedId), m_renderer(renderer)
130{
131 auto &registry = AScene::getRegistry();
132
133 registry.onComponentAdded(
134 [&renderer, &registry](const ecs::Entity e, const std::type_info &type)
135 {
136 const auto *colorComp = registry.getComponent<ecs::Color>(e);
137 const auto *fontComp = registry.getComponent<ecs::Font>(e);
138 const auto *rectComp = registry.getComponent<ecs::Rect>(e);
139 const auto *scaleComp = registry.getComponent<ecs::Scale>(e);
140 const auto *textComp = registry.getComponent<ecs::Text>(e);
141 const auto *textureComp = registry.getComponent<ecs::Texture>(e);
142 const auto *transform = registry.getComponent<ecs::Transform>(e);
143
144 if (type == typeid(ecs::Text))
145 {
146 if (textComp && transform && fontComp)
147 {
148 renderer->createFont(fontComp->id, fontComp->path);
149 renderer->createText(
150 {.font_name = fontComp->id,
151 .color = {.r = colorComp->r, .g = colorComp->g, .b = colorComp->b, .a = colorComp->a},
152 .content = textComp->content,
153 .size = textComp->font_size,
154 .x = transform->x,
155 .y = transform->y,
156 .name = textComp->id});
157 }
158 }
159 else if (type == typeid(ecs::Texture))
160 {
161 const float scale_x = scaleComp ? scaleComp->x : 1.F;
162 const float scale_y = scaleComp ? scaleComp->y : 1.F;
163
164 renderer->createTexture(textureComp->id, textureComp->path);
165
166 if (transform && textureComp)
167 {
168 if (rectComp)
169 {
170 renderer->createSprite(textureComp->id + std::to_string(e), textureComp->id, transform->x,
171 transform->y, scale_x, scale_y, static_cast<int>(rectComp->pos_x),
172 static_cast<int>(rectComp->pos_y), rectComp->size_x, rectComp->size_y);
173 }
174 else
175 {
176 renderer->createSprite(textureComp->id + std::to_string(e), textureComp->id, transform->x,
177 transform->y);
178 }
179 }
180 }
181 });
182
184 registry.createEntity()
185 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
186 .with<ecs::Transform>("transform_title", 100.F, 60.F, 0.F)
189 .with<ecs::Text>("title", std::string("FLAPPY BIRD"), 80U)
190 .build();
191
192 for (size_t i = 0; i < m_menuOptions.size(); ++i)
193 {
194 registry.createEntity()
195 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
196 .with<ecs::Transform>("transform_menu", 100.F, 200.F + i * 60.F, 0.F)
199 .with<ecs::Text>("menu_" + m_menuOptions[i], m_menuOptions[i], 40U)
200 .build();
201 }
202
204 registry.createEntity()
205 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
206 .with<ecs::Transform>("transform_player_name_value", 580.F, 200.F, 0.F)
207 .with<ecs::Color>("color_player_name_value", utl::Config::Color::TEXT_VALUE_COLOR.r,
210 .with<ecs::Text>("player_name_value", m_playerName, 24U)
211 .build();
212
214 registry.createEntity()
215 .with<ecs::Font>("main_font", utl::Path::Font::FONTS_RTYPE)
216 .with<ecs::Transform>("transform_skin_value", 580.F, 260.F, 0.F)
217 .with<ecs::Color>("color_skin_value", utl::Config::Color::TEXT_VALUE_COLOR.r,
220 .with<ecs::Text>("skin_value", std::to_string(m_skinIndex + 1), 24U)
221 .build();
222
224 registry.createEntity()
225 .with<ecs::Transform>("transform_player_preview", 750.F, 260.F, 0.F)
226 .with<ecs::Rect>("player_preview_rect", 0.F, 0.F, 33, 17)
227 .with<ecs::Scale>("player_preview_scale", 3.0F, 3.0F)
228 .with<ecs::Texture>("player_preview_texture", utl::Path::Texture::TEXTURE_PLAYER)
229 .build();
230
231 m_selectedIndex = 3;
232
234}
235
236void gme::ConfigFlappy::update(const float dt, const eng::WindowSize & /*size*/)
237{
238 auto &reg = getRegistry();
239
240 auto &colors = reg.getAll<ecs::Color>();
241 auto &texts = reg.getAll<ecs::Text>();
242
243 m_animationTime += dt;
244 m_titlePulseTime += dt;
245
246 if (auto *titleColor = reg.getComponent<ecs::Color>(m_titleEntity))
247 {
248 const float pulse = (std::sin(m_titlePulseTime * 1.2f) + 1.0f) * 0.5f;
249 titleColor->r = static_cast<uint8_t>(utl::Config::Color::CYAN_ELECTRIC.r * (0.8f + pulse * 0.2f));
250 titleColor->g = static_cast<uint8_t>(utl::Config::Color::CYAN_ELECTRIC.g * (0.8f + pulse * 0.2f));
251 titleColor->b = static_cast<uint8_t>(utl::Config::Color::CYAN_ELECTRIC.b * (0.9f + pulse * 0.1f));
252 }
253 if (auto *titleTransform = reg.getComponent<ecs::Transform>(m_titleEntity))
254 {
255 titleTransform->y = 60.0f + std::sin(m_titlePulseTime * 0.8f) * 2.0f;
256 }
257 int i = 0;
258 for (auto &[entity, text] : texts)
259 {
260 if (text.content == "Player Name" || text.content == "Skin" || text.content == "Start Game" ||
261 text.content == "Go back to menu")
262 {
263 auto &color = colors.at(entity);
264
265 if (i == m_selectedIndex)
266 {
267 const float glowIntensity = std::sin(m_animationTime * 2.5f);
268 color.r = 0U;
269 color.g = static_cast<unsigned char>(191U + (glowIntensity * 50));
270 color.b = 255U;
271 }
272 else
273 {
277 }
278
279 i++;
280 }
281 }
282}
283
285{
286 switch (event.type)
287 {
289 if (event.key == eng::Key::Up)
290 {
291 m_playMusic = true;
292 m_selectedIndex = (m_selectedIndex == 0) ? static_cast<int>(m_menuOptions.size()) - 1 : m_selectedIndex - 1;
293 }
294 else if (event.key == eng::Key::Down)
295 {
296 m_playMusic = true;
297 m_selectedIndex = (m_selectedIndex == static_cast<int>(m_menuOptions.size()) - 1) ? 0 : m_selectedIndex + 1;
298 }
299 else if (event.key == eng::Key::Enter)
300 {
301 const std::string &selectedOption = m_menuOptions[m_selectedIndex];
302 if (onOptionSelected)
303 {
304 onOptionSelected(selectedOption, m_playerName, m_skinIndex);
305 }
306 }
307 else if (event.key == eng::Key::Delete)
308 {
309 if (m_selectedIndex == 3)
310 {
311 std::string &currentField = getCurrentEditField();
312 if (!currentField.empty())
313 {
314 currentField.pop_back();
315 updateValueDisplay();
316 }
317 }
318 }
319 else if (event.key == eng::Key::Left || event.key == eng::Key::Right)
320 {
321 if (m_selectedIndex >= 0 && m_selectedIndex < static_cast<int>(m_menuOptions.size()))
322 {
323 const std::string &selectedOption = m_menuOptions[m_selectedIndex];
324 if (m_selectedIndex == 2)
325 {
326 if (event.key == eng::Key::Left)
327 {
328 m_skinIndex = (m_skinIndex == 0) ? 3 : m_skinIndex - 1;
329 }
330 else
331 {
332 m_skinIndex = (m_skinIndex == 3) ? 0 : m_skinIndex + 1;
333 }
334 updateValueDisplay();
335 }
336 }
337 }
338 else
339 {
340 if (m_selectedIndex == 3)
341 {
342 if (const char c = keyToChar(event.key); c != '\0')
343 {
344 std::string &currentField = getCurrentEditField();
345 if (currentField.length() < 16)
346 {
347 currentField += c;
348 updateValueDisplay();
349 }
350 }
351 }
352 }
353 break;
354
356 if (event.key == eng::Key::Up)
357 {
358 m_keysPressed[eng::Key::Up] = false;
359 }
360 if (event.key == eng::Key::Down)
361 {
362 m_keysPressed[eng::Key::Down] = false;
363 }
364 if (event.key == eng::Key::Left)
365 {
366 m_keysPressed[eng::Key::Left] = false;
367 }
368 if (event.key == eng::Key::Right)
369 {
370 m_keysPressed[eng::Key::Right] = false;
371 }
372 if (event.key == eng::Key::Space)
373 {
374 m_keysPressed[eng::Key::Space] = false;
375 }
376 break;
377
378 default:
379 break;
380 }
381}
382
This file contains the component definitions.
This file contains the FlappyBird configuration scene.
Configuration constants for the multiplayer game.
void event(const eng::Event &event) override
const std::vector< std::string > m_menuOptions
char keyToChar(eng::Key key) const
ConfigFlappy(eng::id assignedId, const std::shared_ptr< eng::IRenderer > &renderer)
std::string & getCurrentEditField()
ecs::Entity m_skinValueEntity
void update(float dt, const eng::WindowSize &size) override
ecs::Entity m_titleEntity
ecs::Entity m_playerNameValueEntity
std::string m_playerName
ecs::Entity m_skinSpriteEntity
static char keyToChar(const eng::Key key, bool shift=false)
This file contains common definitions and constants.
std::uint32_t Entity
Definition Entity.hpp:13
unsigned int id
Definition IScene.hpp:20
static constexpr eng::Color TEXT_VALUE_COLOR
Definition Common.hpp:66
static constexpr eng::Color GRAY_BLUE_SUBTLE
Definition Common.hpp:57
static constexpr eng::Color WHITE
Definition Common.hpp:64
static constexpr eng::Color CYAN_ELECTRIC
Definition Common.hpp:56
constexpr auto FONTS_RTYPE
Definition Common.hpp:97
constexpr auto TEXTURE_PLAYER
Definition Common.hpp:114
std::string id
Definition Component.hpp:15
unsigned char r
Definition IRenderer.hpp:17
unsigned char a
Definition IRenderer.hpp:20
unsigned char g
Definition IRenderer.hpp:18
unsigned char b
Definition IRenderer.hpp:19
EventType type