diff options
Diffstat (limited to 'src/crepe/api')
-rw-r--r-- | src/crepe/api/LoopManager.cpp | 74 | ||||
-rw-r--r-- | src/crepe/api/LoopManager.h | 51 | ||||
-rw-r--r-- | src/crepe/api/LoopManager.hpp | 36 |
3 files changed, 35 insertions, 126 deletions
diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp index 3e9e21c..637fbe1 100644 --- a/src/crepe/api/LoopManager.cpp +++ b/src/crepe/api/LoopManager.cpp @@ -6,40 +6,51 @@ #include "../system/PhysicsSystem.h" #include "../system/RenderSystem.h" #include "../system/ScriptSystem.h" -#include "manager/EventManager.h" +#include "../system/EventSystem.h" #include "LoopManager.h" using namespace crepe; using namespace std; -LoopManager::LoopManager() { - this->load_system<AnimatorSystem>(); - this->load_system<CollisionSystem>(); - this->load_system<ParticleSystem>(); - this->load_system<PhysicsSystem>(); - this->load_system<RenderSystem>(); - this->load_system<ScriptSystem>(); - this->load_system<InputSystem>(); - this->load_system<AudioSystem>(); -} - -void LoopManager::process_input() { this->get_system<InputSystem>().update(); } +LoopManager::LoopManager() + : systems({ + ScriptSystem{this->mediator}, + PhysicsSystem{this->mediator}, + CollisionSystem{this->mediator}, + AnimatorSystem{this->mediator}, + ParticleSystem{this->mediator}, + RenderSystem{this->mediator}, + InputSystem{this->mediator}, + EventSystem{this->mediator}, + AudioSystem{this->mediator}, + }) { } void LoopManager::start() { this->setup(); this->loop(); } -void LoopManager::set_running(bool running) { this->game_running = running; } void LoopManager::fixed_update() { - // TODO: retrieve EventManager from direct member after singleton refactor - EventManager & ev = this->mediator.event_manager; - ev.dispatch_events(); - this->get_system<ScriptSystem>().update(); - this->get_system<PhysicsSystem>().update(); - this->get_system<CollisionSystem>().update(); - this->get_system<AudioSystem>().update(); + for (System & system : this->systems) { + if (!system.active) continue; + system.fixed_update(); + } +} + +void LoopManager::frame_update() { + for (System & system : this->systems) { + if (!system.active) continue; + system.frame_update(); + } +} + +void LoopManager::setup() { + LoopTimer & timer = this->loop_timer; + this->game_running = true; + this->scene_manager.load_next_scene(); + timer.start(); + timer.set_fps(200); } void LoopManager::loop() { @@ -50,31 +61,12 @@ void LoopManager::loop() { timer.update(); while (timer.get_lag() >= timer.get_fixed_delta_time()) { - this->process_input(); this->fixed_update(); timer.advance_fixed_update(); } - this->update(); - this->render(); - + this->frame_update(); timer.enforce_frame_rate(); } } -void LoopManager::setup() { - LoopTimer & timer = this->loop_timer; - this->game_running = true; - this->scene_manager.load_next_scene(); - timer.start(); - timer.set_fps(200); -} - -void LoopManager::render() { - if (!this->game_running) return; - - this->get_system<AnimatorSystem>().update(); - this->get_system<RenderSystem>().update(); -} - -void LoopManager::update() {} diff --git a/src/crepe/api/LoopManager.h b/src/crepe/api/LoopManager.h index 0947f94..1ac6a39 100644 --- a/src/crepe/api/LoopManager.h +++ b/src/crepe/api/LoopManager.h @@ -1,7 +1,5 @@ #pragma once -#include <memory> - #include "../facade/SDLContext.h" #include "../manager/ComponentManager.h" #include "../manager/ResourceManager.h" @@ -45,25 +43,11 @@ private: void loop(); /** - * \brief Function for handling input-related system calls. - * - * Processes user inputs from keyboard and mouse. - */ - void process_input(); - - /** * \brief Per-frame update. * * Updates the game state based on the elapsed time since the last frame. */ - void update(); - - /** - * \brief Late update which is called after update(). - * - * This function can be used for final adjustments before rendering. - */ - void late_update(); + void frame_update(); /** * \brief Fixed update executed at a fixed rate. @@ -72,20 +56,6 @@ private: */ void fixed_update(); - /** - * \brief Set game running variable - * - * \param running running (false = game shutdown, true = game running) - */ - void set_running(bool running); - - /** - * \brief Function for executing render-related systems. - * - * Renders the current state of the game to the screen. - */ - void render(); - bool game_running = false; private: @@ -107,25 +77,8 @@ private: 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 LoopManager using LoopManager::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(); - /** - * \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(); + std::vector<System> systems; }; } // namespace crepe diff --git a/src/crepe/api/LoopManager.hpp b/src/crepe/api/LoopManager.hpp index 266758a..51afa70 100644 --- a/src/crepe/api/LoopManager.hpp +++ b/src/crepe/api/LoopManager.hpp @@ -1,11 +1,5 @@ #pragma once -#include <cassert> -#include <format> -#include <memory> - -#include "../system/System.h" - #include "LoopManager.h" namespace crepe { @@ -15,34 +9,4 @@ void LoopManager::add_scene() { this->scene_manager.add_scene<T>(); } -template <class T> -T & LoopManager::get_system() { - using namespace std; - static_assert(is_base_of<System, T>::value, - "get_system must recieve a derivative class of System"); - - const type_info & type = typeid(T); - if (!this->systems.contains(type)) - throw runtime_error(format("LoopManager: {} is not initialized", type.name())); - - System * system = this->systems.at(type).get(); - T * concrete_system = dynamic_cast<T *>(system); - assert(concrete_system != nullptr); - - return *concrete_system; -} - -template <class T> -void LoopManager::load_system() { - using namespace std; - static_assert(is_base_of<System, T>::value, - "load_system must recieve a derivative class of System"); - - const type_info & type = typeid(T); - if (this->systems.contains(type)) - throw runtime_error(format("LoopManager: {} is already initialized", type.name())); - System * system = new T(this->mediator); - this->systems[type] = unique_ptr<System>(system); -} - } // namespace crepe |