r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
Explosion.hpp
Go to the documentation of this file.
1///
2/// @file Systems.hpp
3/// @brief This file contains the system definitions
4/// @namespace cli
5///
6
7#pragma once
8
9#include <vector>
10
11#include "ECS/Component.hpp"
12#include "ECS/Registry.hpp"
14
15namespace cli
16{
17
18 class ExplosionSystem final : public eng::ISystem
19 {
20 public:
21 explicit ExplosionSystem(eng::IRenderer &renderer) : m_renderer(renderer) {}
22 ~ExplosionSystem() override = default;
23
28
29 bool isEnable() override { return true; }
30 void setEnable(bool enable) override { (void)enable; }
31
32 void update(ecs::Registry &registry, float dt) override
33 {
34 std::vector<ecs::Entity> explosionsToRemove;
35
36 for (auto &[entity, explosion] : registry.getAll<ecs::Explosion>())
37 {
38 auto *transform = registry.getComponent<ecs::Transform>(entity);
39 auto *rect = registry.getComponent<ecs::Rect>(entity);
40 auto *texture = registry.getComponent<ecs::Texture>(entity);
41 auto *scale = registry.getComponent<ecs::Scale>(entity);
42
43 if (!transform || !rect || !texture || !scale)
44 continue;
45
46 explosion.current_time += dt;
47 if (explosion.current_time >= explosion.frame_duration)
48 {
49 explosion.current_time = 0.0f;
50 explosion.current_frame = (explosion.current_frame + 1) % explosion.total_frames;
51
52 int frame_x = (explosion.current_frame % explosion.frames_per_row) *
53 static_cast<int>(explosion.frame_width);
54 int frame_y = (explosion.current_frame / explosion.frames_per_row) *
55 static_cast<int>(explosion.frame_height);
56
57 rect->pos_x = static_cast<float>(frame_x);
58 rect->pos_y = static_cast<float>(frame_y);
59 }
60
61 m_renderer.createSprite(texture->id + std::to_string(entity), texture->path, transform->x,
62 transform->y, scale->x, scale->y, static_cast<int>(rect->pos_x),
63 static_cast<int>(rect->pos_y), static_cast<int>(rect->size_x),
64 static_cast<int>(rect->size_y));
65 m_renderer.drawSprite(texture->id + std::to_string(entity));
66
67 explosion.current_lifetime += dt;
68 if (explosion.current_lifetime >= explosion.lifetime)
69 {
70 explosionsToRemove.push_back(entity);
71 }
72 }
73
74 for (ecs::Entity entity : explosionsToRemove)
75 {
76 removeExplosion(registry, entity);
77 }
78 }
79
80 private:
82
84 {
85 if (registry.hasComponent<ecs::Explosion>(entity))
86 registry.removeComponent<ecs::Explosion>(entity);
87 if (registry.hasComponent<ecs::Transform>(entity))
88 registry.removeComponent<ecs::Transform>(entity);
89 if (registry.hasComponent<ecs::Rect>(entity))
90 registry.removeComponent<ecs::Rect>(entity);
91 if (registry.hasComponent<ecs::Texture>(entity))
92 registry.removeComponent<ecs::Texture>(entity);
93 if (registry.hasComponent<ecs::Scale>(entity))
94 registry.removeComponent<ecs::Scale>(entity);
95 }
96 };
97
98} // namespace cli
This file contains the component definitions.
This file contains the IRenderer class declaration.
This file contains the Registry class declaration.
ExplosionSystem & operator=(const ExplosionSystem &)=delete
ExplosionSystem(const ExplosionSystem &)=delete
eng::IRenderer & m_renderer
Definition Explosion.hpp:81
ExplosionSystem & operator=(ExplosionSystem &&)=delete
ExplosionSystem(eng::IRenderer &renderer)
Definition Explosion.hpp:21
bool isEnable() override
Definition Explosion.hpp:29
void setEnable(bool enable) override
Definition Explosion.hpp:30
void removeExplosion(ecs::Registry &registry, ecs::Entity entity)
Definition Explosion.hpp:83
void update(ecs::Registry &registry, float dt) override
Definition Explosion.hpp:32
ExplosionSystem(ExplosionSystem &&)=delete
~ExplosionSystem() override=default
Class for managing entities and their components.
Definition Registry.hpp:25
bool hasComponent(Entity e)
Definition Registry.hpp:79
std::unordered_map< Entity, T > & getAll()
Definition Registry.hpp:77
T * getComponent(Entity e)
Definition Registry.hpp:71
void removeComponent(Entity e)
Definition Registry.hpp:85
Interface for the renderer.
virtual void drawSprite(const std::string &name)=0
virtual void createSprite(const std::string &name, const std::string &textureName, float x, float y, float scale_x=1, float scale_y=1, int fx=0, int fy=0, int fnx=-1, int fny=-1)=0
std::uint32_t Entity
Definition Entity.hpp:13
std::string id
Definition Component.hpp:15