aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/manager/SystemManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/manager/SystemManager.h')
-rw-r--r--src/crepe/manager/SystemManager.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/crepe/manager/SystemManager.h b/src/crepe/manager/SystemManager.h
new file mode 100644
index 0000000..6cf7f2b
--- /dev/null
+++ b/src/crepe/manager/SystemManager.h
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "../system/System.h"
+
+#include "Manager.h"
+
+namespace crepe {
+
+class SystemManager : public Manager {
+public:
+ SystemManager(Mediator &);
+
+ /**
+ * \brief Per-frame update.
+ *
+ * Updates the game state based on the elapsed time since the last frame.
+ */
+ void frame_update();
+
+ /**
+ * \brief Fixed update executed at a fixed rate.
+ *
+ * This function updates physics and game logic based on LoopTimer's fixed_delta_time.
+ */
+ void fixed_update();
+
+private:
+ /**
+ * \brief Collection of System instances
+ *
+ * This map holds System instances indexed by the system's class typeid. It is filled in the
+ * constructor of \c SystemManager using SystemManager::load_system.
+ */
+ std::unordered_map<std::type_index, std::unique_ptr<System>> systems;
+ /**
+ * \brief Initialize a system
+ * \tparam T System type (must be derivative of \c System)
+ */
+ template <class T>
+ void load_system();
+
+public:
+ /**
+ * \brief Retrieve a reference to ECS system
+ * \tparam T System type
+ * \returns Reference to system instance
+ * \throws std::runtime_error if the System is not initialized
+ */
+ template <class T>
+ T & get_system();
+
+public:
+ typedef std::unordered_map<std::type_index, bool> Snapshot;
+ Snapshot save();
+ void restore(const Snapshot & snapshot);
+ void disable_all();
+};
+
+} // namespace crepe
+
+#include "SystemManager.hpp"