aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/system
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-11-08 20:00:21 +0100
committerLoek Le Blansch <loek@pipeframe.xyz>2024-11-08 20:00:21 +0100
commit7817c85e84560933a33ad86ec3f9ca3d48d327d5 (patch)
treec309b9f779ca33f01d5755222a56ffca517baef4 /src/crepe/system
parent0feda3d123ff99a1b9e41837482268bebfd9140a (diff)
parentac8a58a2a16118ea4c40fcc533c3420edde45122 (diff)
Merge branch 'niels/cleanup' of github.com:lonkaars/crepe
Diffstat (limited to 'src/crepe/system')
-rw-r--r--src/crepe/system/AnimatorSystem.cpp38
-rw-r--r--src/crepe/system/AnimatorSystem.h58
-rw-r--r--src/crepe/system/CMakeLists.txt2
-rw-r--r--src/crepe/system/RenderSystem.cpp35
-rw-r--r--src/crepe/system/RenderSystem.h71
5 files changed, 191 insertions, 13 deletions
diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp
new file mode 100644
index 0000000..4ea889a
--- /dev/null
+++ b/src/crepe/system/AnimatorSystem.cpp
@@ -0,0 +1,38 @@
+
+#include <cstdint>
+#include <functional>
+#include <vector>
+
+#include "facade/SDLContext.h"
+#include "util/log.h"
+#include "api/Animator.h"
+
+#include "ComponentManager.h"
+#include "AnimatorSystem.h"
+
+using namespace crepe;
+
+AnimatorSystem::AnimatorSystem() { dbg_trace(); }
+
+AnimatorSystem::~AnimatorSystem() { dbg_trace(); }
+
+AnimatorSystem & AnimatorSystem::get_instance() {
+ static AnimatorSystem instance;
+ return instance;
+}
+
+void AnimatorSystem::update() {
+ ComponentManager& mgr = ComponentManager::get_instance();
+
+ std::vector<std::reference_wrapper<Animator>> animations = mgr.get_components_by_type<Animator>();
+
+ uint64_t tick = SDLContext::get_instance().get_ticks();
+ for(Animator& a : animations){
+ if (a.active) {
+ a.curr_row = (tick / 100) % a.row;
+ a.animator_rect.x = (a.curr_row * a.animator_rect.w) + a.curr_col;
+ a.spritesheet.sprite_rect = a.animator_rect;
+ }
+ }
+}
+
diff --git a/src/crepe/system/AnimatorSystem.h b/src/crepe/system/AnimatorSystem.h
new file mode 100644
index 0000000..c377ce9
--- /dev/null
+++ b/src/crepe/system/AnimatorSystem.h
@@ -0,0 +1,58 @@
+#pragma once
+
+#include "System.h"
+
+
+
+//TODO:
+// control if flip works with animation system
+
+namespace crepe {
+
+/**
+ * \brief The AnimatorSystem is responsible for managing and updating all Animator components.
+ *
+ * This system is responsible for controlling the behavior of the animations for all entities
+ * that have the Animator component attached. It updates the animations by controlling their
+ * frame changes, looping behavior, and overall animation state.
+ */
+class AnimatorSystem : public System {
+
+public:
+ /**
+ * \brief Retrieves the singleton instance of the AnimatorSystem.
+ *
+ * \return A reference to the single instance of the AnimatorSystem.
+ *
+ * This method ensures that there is only one instance of the AnimatorSystem, following the
+ * singleton design pattern. It can be used to access the system globally.
+ */
+ static AnimatorSystem & get_instance();
+
+ /**
+ * \brief Updates the Animator components.
+ *
+ * This method is called periodically (likely every frame) to update the state of all
+ * Animator components, moving the animations forward and managing their behavior (e.g., looping).
+ */
+ void update() override;
+
+private:
+ /**
+ * \brief Private constructor for the AnimatorSystem.
+ *
+ * The constructor is private to enforce the singleton pattern, ensuring that only
+ * one instance of this system can exist.
+ */
+ AnimatorSystem();
+
+ /**
+ * \brief Private destructor for the AnimatorSystem.
+ *
+ * The destructor cleans up any resources used by the AnimatorSystem. It is private
+ * to maintain the singleton pattern and prevent direct deletion.
+ */
+ ~AnimatorSystem();
+};
+
+} // namespace crepe
diff --git a/src/crepe/system/CMakeLists.txt b/src/crepe/system/CMakeLists.txt
index ff6f66f..4c18b87 100644
--- a/src/crepe/system/CMakeLists.txt
+++ b/src/crepe/system/CMakeLists.txt
@@ -4,6 +4,7 @@ target_sources(crepe PUBLIC
PhysicsSystem.cpp
CollisionSystem.cpp
RenderSystem.cpp
+ AnimatorSystem.cpp
)
target_sources(crepe PUBLIC FILE_SET HEADERS FILES
@@ -12,4 +13,5 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES
PhysicsSystem.h
CollisionSystem.h
RenderSystem.h
+ AnimatorSystem.h
)
diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp
index 5a07cc2..849d810 100644
--- a/src/crepe/system/RenderSystem.cpp
+++ b/src/crepe/system/RenderSystem.cpp
@@ -20,7 +20,23 @@ RenderSystem & RenderSystem::get_instance() {
return instance;
}
-void RenderSystem::update() {
+void RenderSystem::clear_screen() const { SDLContext::get_instance().clear_screen(); }
+
+void RenderSystem::present_screen() const {
+ SDLContext::get_instance().present_screen();
+}
+void RenderSystem::update_camera() {
+ ComponentManager & mgr = ComponentManager::get_instance();
+
+ std::vector<std::reference_wrapper<Camera>> cameras
+ = mgr.get_components_by_type<Camera>();
+
+ for (Camera & cam : cameras) {
+ SDLContext::get_instance().camera(cam);
+ this->curr_cam = &cam;
+ }
+}
+void RenderSystem::render_sprites() const {
ComponentManager & mgr = ComponentManager::get_instance();
@@ -28,14 +44,15 @@ void RenderSystem::update() {
= mgr.get_components_by_type<Sprite>();
SDLContext & render = SDLContext::get_instance();
- render.clear_screen();
-
for (const Sprite & sprite : sprites) {
- std::vector<std::reference_wrapper<Transform>> transforms
- = mgr.get_components_by_id<Transform>(sprite.game_object_id);
- for (const Transform & transform : transforms) {
- render.draw(sprite, transform);
- }
+ auto transforms = mgr.get_components_by_id<Transform>(sprite.game_object_id);
+ render.draw(sprite, transforms[0] , *curr_cam);
}
- render.present_screen();
+}
+
+void RenderSystem::update() {
+ this->clear_screen();
+ this->update_camera();
+ this->render_sprites();
+ this->present_screen();
}
diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h
index 4b910a4..ec80a0e 100644
--- a/src/crepe/system/RenderSystem.h
+++ b/src/crepe/system/RenderSystem.h
@@ -1,17 +1,80 @@
#pragma once
+#include "api/Camera.h"
+
#include "System.h"
+
namespace crepe {
+/**
+ * \class RenderSystem
+ * \brief Manages rendering operations for all game objects.
+ *
+ * RenderSystem is responsible for rendering sprites, clearing and presenting the screen,
+ * and managing the active camera. It functions as a singleton, providing centralized
+ * rendering services for the application.
+ */
class RenderSystem : public System {
public:
- static RenderSystem & get_instance();
- void update();
+ /**
+ * \brief Gets the singleton instance of RenderSystem.
+ * \return Reference to the RenderSystem instance.
+ */
+ static RenderSystem & get_instance();
+
+ /**
+ * \brief Updates the RenderSystem for the current frame.
+ * This method is called to perform all rendering operations for the current game frame.
+ */
+ void update() override;
+
+private:
+ /**
+ * \brief Constructs a RenderSystem instance.
+ * Private constructor to enforce singleton pattern.
+ */
+ RenderSystem();
+
+ /**
+ * \brief Destroys the RenderSystem instance.
+ */
+ ~RenderSystem();
+
+ /**
+ * \brief Clears the screen in preparation for rendering.
+ */
+ void clear_screen() const;
+
+ /**
+ * \brief Presents the rendered frame to the display.
+ */
+ void present_screen() const;
+
+ /**
+ * \brief Updates the active camera used for rendering.
+ */
+ void update_camera();
+
+ /**
+ * \brief Renders all active sprites to the screen.
+ */
+ void render_sprites() const;
+
+ /**
+ * \todo Include color handling for sprites.
+ * \todo Implement particle emitter rendering with sprites.
+ * \todo Add text rendering using SDL_ttf for text components.
+ * \todo Implement a text component and a button component.
+ * \todo Ensure each sprite is checked for active status before rendering.
+ * \todo Sort all layers by order before rendering.
+ * \todo Consider adding text input functionality.
+ */
private:
- RenderSystem();
- ~RenderSystem();
+ //! Pointer to the current active camera for rendering
+ // \todo needs a better solution
+ Camera * curr_cam;
};
} // namespace crepe