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