diff options
Diffstat (limited to 'src/crepe/manager/SystemManager.h')
-rw-r--r-- | src/crepe/manager/SystemManager.h | 61 |
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" |