r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
Sprite.hpp
Go to the documentation of this file.
1///
2/// @file Sprite.hpp
3/// @brief This file contains the sprite system definition
4/// @namespace ecs
5///
6
7#pragma once
8
9#include <algorithm>
10#include <ranges>
11#include <vector>
12
13#include "ECS/Component.hpp"
15#include "ECS/Registry.hpp"
17
18namespace ecs
19{
20
21 ///
22 /// @class SpriteSystem
23 /// @brief Class for sprite system
24 /// @namespace ecs
25 ///
26 class SpriteSystem final : public ASystem
27 {
28 public:
29 explicit SpriteSystem(const std::shared_ptr<eng::IRenderer> &renderer) : m_renderer(renderer) {}
30 ~SpriteSystem() override = default;
31
32 SpriteSystem(const SpriteSystem &) = delete;
36
37 void update(Registry &registry, float /* dt */) override
38 {
39 std::vector<std::pair<Entity, int>> spritesWithLayers;
40 spritesWithLayers.reserve(
41 registry.getAll<Texture>().size()); // Pré-allocation pour éviter réallocations
42
43 for (auto &pair : registry.getAll<Texture>())
44 {
45 const auto entity = pair.first;
46 const auto *layer = registry.getComponent<Layer>(entity);
47 int layerValue = (layer != nullptr) ? layer->layer : 0;
48 spritesWithLayers.emplace_back(entity, layerValue);
49 }
50 std::sort(spritesWithLayers.begin(), spritesWithLayers.end(),
51 [](const auto &a, const auto &b) { return a.second < b.second; });
52 std::string spriteName;
53 spriteName.reserve(64); // Taille typique attendue
54
55 for (const auto &pair : spritesWithLayers)
56 {
57 const auto entity = pair.first;
58 const auto *sprite = registry.getComponent<Texture>(entity);
59 if (!sprite)
60 continue;
61
62 const auto *transform = registry.getComponent<Transform>(entity);
63 const auto *rect = registry.getComponent<Rect>(entity);
64 const auto *scale = registry.getComponent<Scale>(entity);
65 const auto *color = registry.getComponent<Color>(entity);
66 const bool hasScrolling = registry.hasComponent<Scrolling>(entity);
67
68 const float x = (transform != nullptr) ? transform->x : 0.F;
69 const float y = (transform != nullptr) ? transform->y : 0.F;
70
71 spriteName.clear();
72 spriteName = sprite->id;
73 spriteName += std::to_string(entity);
74
75 m_renderer->setSpriteTexture(spriteName, sprite->path);
76 m_renderer->setSpritePosition(spriteName, x, y);
77 if ((scale != nullptr) && !hasScrolling)
78 {
79 m_renderer->setSpriteScale(spriteName, static_cast<int>(scale->x), static_cast<int>(scale->y));
80 }
81 if (rect != nullptr)
82 {
83 m_renderer->setSpriteFrame(spriteName, static_cast<int>(rect->pos_x),
84 static_cast<int>(rect->pos_y), rect->size_x, rect->size_y);
85 }
86 if (color != nullptr)
87 {
88 m_renderer->setSpriteColor(sprite->id + std::to_string(entity),
89 {.r = color->r, .g = color->g, .b = color->b, .a = color->a});
90 }
91 m_renderer->drawSprite(spriteName);
92 }
93 }
94
95 private:
96 const std::shared_ptr<eng::IRenderer> &m_renderer;
97 }; // class SpriteSystem
98} // namespace ecs
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
Class for sprite system.
Definition Sprite.hpp:27
void update(Registry &registry, float) override
Definition Sprite.hpp:37
~SpriteSystem() override=default
SpriteSystem(const SpriteSystem &)=delete
SpriteSystem & operator=(const SpriteSystem &)=delete
SpriteSystem(SpriteSystem &&)=delete
SpriteSystem & operator=(SpriteSystem &&)=delete
SpriteSystem(const std::shared_ptr< eng::IRenderer > &renderer)
Definition Sprite.hpp:29
const std::shared_ptr< eng::IRenderer > & m_renderer
Definition Sprite.hpp:96
virtual void drawSprite(const std::string &name)=0
virtual void setSpriteScale(const std::string &name, int x, int y)=0
virtual void setSpriteColor(const std::string &name, Color color)=0
virtual void setSpritePosition(const std::string &name, float x, float y)=0
virtual void setSpriteTexture(const std::string &name, const std::string &path)=0
virtual void setSpriteFrame(const std::string &name, int fx, int fy, int fnx, int fny)=0