r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
Collision.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 <cmath>
10#include <vector>
11
12#include "Client/GameConfig.hpp"
13#include "ECS/Component.hpp"
14#include "ECS/Registry.hpp"
16
17namespace cli
18{
19
20 class CollisionSystem final : public eng::ISystem
21 {
22 public:
23 explicit CollisionSystem(eng::IRenderer &renderer) : m_renderer(renderer) {}
24 ~CollisionSystem() override = default;
25
30
31 bool isEnable() override { return true; }
32 void setEnable(bool enable) override { (void)enable; }
33
34 void update(ecs::Registry &registry, float dt) override
35 {
36 std::vector<ecs::Entity> projectilesToRemove;
37 std::vector<ecs::Entity> enemiesToRemove;
38 std::vector<ecs::Entity> asteroidsToRemove;
39
40 for (auto &[projectileEntity, projectile] : registry.getAll<ecs::Projectile>())
41 {
42 auto *projectileTransform = registry.getComponent<ecs::Transform>(projectileEntity);
43 auto *projectileHitbox = registry.getComponent<ecs::Hitbox>(projectileEntity);
44 if (!projectileTransform || !projectileHitbox)
45 continue;
46
47 for (auto &[enemyEntity, enemy] : registry.getAll<ecs::Enemy>())
48 {
49 auto *enemyTransform = registry.getComponent<ecs::Transform>(enemyEntity);
50 auto *enemyHitbox = registry.getComponent<ecs::Hitbox>(enemyEntity);
51 if (!enemyTransform || !enemyHitbox)
52 continue;
53
54 if (checkCircularCollision(*projectileTransform, *projectileHitbox, *enemyTransform,
55 *enemyHitbox))
56 {
57 enemy.health -= projectile.damage;
58
59 projectilesToRemove.push_back(projectileEntity);
60
61 if (enemy.health <= 0.0f)
62 {
63 createExplosion(registry, enemyTransform->x, enemyTransform->y);
64 enemiesToRemove.push_back(enemyEntity);
65 }
66 break;
67 }
68 }
69 }
70
71 for (auto &[projectileEntity, projectile] : registry.getAll<ecs::Projectile>())
72 {
73 auto *projectileTransform = registry.getComponent<ecs::Transform>(projectileEntity);
74 auto *projectileHitbox = registry.getComponent<ecs::Hitbox>(projectileEntity);
75 if (!projectileTransform || !projectileHitbox)
76 continue;
77
78 for (auto &[asteroidEntity, asteroid] : registry.getAll<ecs::Asteroid>())
79 {
80 auto *asteroidTransform = registry.getComponent<ecs::Transform>(asteroidEntity);
81 auto *asteroidHitbox = registry.getComponent<ecs::Hitbox>(asteroidEntity);
82 if (!asteroidTransform || !asteroidHitbox)
83 continue;
84
85 if (checkCircularCollision(*projectileTransform, *projectileHitbox, *asteroidTransform,
86 *asteroidHitbox))
87 {
88 asteroid.health -= projectile.damage;
89
90 projectilesToRemove.push_back(projectileEntity);
91
92 if (asteroid.health <= 0.0f)
93 {
94 createExplosion(registry, asteroidTransform->x, asteroidTransform->y);
95 asteroidsToRemove.push_back(asteroidEntity);
96 }
97 break;
98 }
99 }
100 }
101
102 for (ecs::Entity entity : projectilesToRemove)
103 {
104 removeProjectile(registry, entity);
105 }
106 for (ecs::Entity entity : enemiesToRemove)
107 {
108 removeEnemy(registry, entity);
109 }
110 for (ecs::Entity entity : asteroidsToRemove)
111 {
112 removeAsteroid(registry, entity);
113 }
114 }
115
116 private:
118
119 bool checkCircularCollision(const ecs::Transform &transform1, const ecs::Hitbox &hitbox1,
120 const ecs::Transform &transform2, const ecs::Hitbox &hitbox2)
121 {
122 float dx = transform1.x - transform2.x;
123 float dy = transform1.y - transform2.y;
124 float distance = std::sqrt(dx * dx + dy * dy);
125 float combinedRadius = hitbox1.radius + hitbox2.radius;
126
127 return distance < combinedRadius;
128 }
129
131 {
132 if (registry.hasComponent<ecs::Projectile>(entity))
133 registry.removeComponent<ecs::Projectile>(entity);
134 if (registry.hasComponent<ecs::Transform>(entity))
135 registry.removeComponent<ecs::Transform>(entity);
136 if (registry.hasComponent<ecs::Velocity>(entity))
137 registry.removeComponent<ecs::Velocity>(entity);
138 if (registry.hasComponent<ecs::Rect>(entity))
139 registry.removeComponent<ecs::Rect>(entity);
140 if (registry.hasComponent<ecs::Texture>(entity))
141 registry.removeComponent<ecs::Texture>(entity);
142 if (registry.hasComponent<ecs::Scale>(entity))
143 registry.removeComponent<ecs::Scale>(entity);
144 if (registry.hasComponent<ecs::Animation>(entity))
145 registry.removeComponent<ecs::Animation>(entity);
146 if (registry.hasComponent<ecs::Hitbox>(entity))
147 registry.removeComponent<ecs::Hitbox>(entity);
148 }
149
150 void removeEnemy(ecs::Registry &registry, ecs::Entity entity)
151 {
152 if (registry.hasComponent<ecs::Enemy>(entity))
153 registry.removeComponent<ecs::Enemy>(entity);
154 if (registry.hasComponent<ecs::Transform>(entity))
155 registry.removeComponent<ecs::Transform>(entity);
156 if (registry.hasComponent<ecs::Velocity>(entity))
157 registry.removeComponent<ecs::Velocity>(entity);
158 if (registry.hasComponent<ecs::Rect>(entity))
159 registry.removeComponent<ecs::Rect>(entity);
160 if (registry.hasComponent<ecs::Texture>(entity))
161 registry.removeComponent<ecs::Texture>(entity);
162 if (registry.hasComponent<ecs::Scale>(entity))
163 registry.removeComponent<ecs::Scale>(entity);
164 if (registry.hasComponent<ecs::Animation>(entity))
165 registry.removeComponent<ecs::Animation>(entity);
166 if (registry.hasComponent<ecs::Hitbox>(entity))
167 registry.removeComponent<ecs::Hitbox>(entity);
168 }
169
171 {
172 if (registry.hasComponent<ecs::Asteroid>(entity))
173 registry.removeComponent<ecs::Asteroid>(entity);
174 if (registry.hasComponent<ecs::Transform>(entity))
175 registry.removeComponent<ecs::Transform>(entity);
176 if (registry.hasComponent<ecs::Velocity>(entity))
177 registry.removeComponent<ecs::Velocity>(entity);
178 if (registry.hasComponent<ecs::Rect>(entity))
179 registry.removeComponent<ecs::Rect>(entity);
180 if (registry.hasComponent<ecs::Texture>(entity))
181 registry.removeComponent<ecs::Texture>(entity);
182 if (registry.hasComponent<ecs::Scale>(entity))
183 registry.removeComponent<ecs::Scale>(entity);
184 if (registry.hasComponent<ecs::Hitbox>(entity))
185 registry.removeComponent<ecs::Hitbox>(entity);
186 }
187
188 void createExplosion(ecs::Registry &registry, float x, float y)
189 {
190 registry.createEntity()
191 .with<ecs::Transform>("explosion_transform", x, y, 0.0f)
192 .with<ecs::Rect>("explosion_rect", 0.0f, 0.0f,
193 static_cast<int>(GameConfig::Explosion::SPRITE_WIDTH),
194 static_cast<int>(GameConfig::Explosion::SPRITE_HEIGHT))
196 .with<ecs::Texture>("explosion_texture", Path::Texture::TEXTURE_EXPLOSION)
201 .build();
202 }
203 }; // class CollisionSystem
204
205} // namespace cli
This file contains the component definitions.
Configuration constants for the game.
This file contains the IRenderer class declaration.
This file contains the Registry class declaration.
CollisionSystem & operator=(CollisionSystem &&)=delete
bool isEnable() override
Definition Collision.hpp:31
CollisionSystem(const CollisionSystem &)=delete
CollisionSystem(eng::IRenderer &renderer)
Definition Collision.hpp:23
void setEnable(bool enable) override
Definition Collision.hpp:32
void removeProjectile(ecs::Registry &registry, ecs::Entity entity)
void createExplosion(ecs::Registry &registry, float x, float y)
void removeEnemy(ecs::Registry &registry, ecs::Entity entity)
CollisionSystem & operator=(const CollisionSystem &)=delete
void update(ecs::Registry &registry, float dt) override
Definition Collision.hpp:34
void removeAsteroid(ecs::Registry &registry, ecs::Entity entity)
CollisionSystem(CollisionSystem &&)=delete
eng::IRenderer & m_renderer
bool checkCircularCollision(const ecs::Transform &transform1, const ecs::Hitbox &hitbox1, const ecs::Transform &transform2, const ecs::Hitbox &hitbox2)
~CollisionSystem() override=default
EntityBuilder & with(Args &&...args)
Definition Registry.hpp:40
Class for managing entities and their components.
Definition Registry.hpp:25
EntityBuilder createEntity()
Definition Registry.hpp:53
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.
constexpr float ANIMATION_DURATION
constexpr float SPRITE_HEIGHT
constexpr float SPRITE_WIDTH
constexpr auto TEXTURE_EXPLOSION
Definition Common.hpp:69
std::uint32_t Entity
Definition Entity.hpp:13