From e585e01b625fcdbc00709c1bbade1b542b1f6139 Mon Sep 17 00:00:00 2001 From: max-001 Date: Wed, 20 Nov 2024 11:42:23 +0100 Subject: Added Doxygen comments/explanation for GameObjects and Scenes --- src/crepe/api/SceneManager.h | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/crepe/api/SceneManager.h') diff --git a/src/crepe/api/SceneManager.h b/src/crepe/api/SceneManager.h index e854794..16d6004 100644 --- a/src/crepe/api/SceneManager.h +++ b/src/crepe/api/SceneManager.h @@ -10,8 +10,15 @@ namespace crepe { class ComponentManager; +/** + * \brief Manages scenes + * + * This class manages scenes. It can add new scenes and load them. It also manages the current scene + * and the next scene. + */ class SceneManager { public: + //! \param mgr Reference to the ComponentManager SceneManager(ComponentManager & mgr); public: @@ -35,8 +42,11 @@ public: void load_next_scene(); private: + //! Vector of scenes std::vector> scenes; + //! Next scene to load std::string next_scene; + //! Reference to the ComponentManager ComponentManager & component_manager; }; -- cgit v1.2.3 From 801be9bd006a5f9f24a76067113bf1fd756aabbd Mon Sep 17 00:00:00 2001 From: max-001 Date: Thu, 21 Nov 2024 08:47:36 +0100 Subject: Replaced Scene's name variable with get_name() method --- src/crepe/api/Scene.cpp | 4 +--- src/crepe/api/Scene.h | 9 ++++++--- src/crepe/api/SceneManager.cpp | 2 +- src/crepe/api/SceneManager.h | 2 +- src/crepe/api/SceneManager.hpp | 6 +++--- src/example/scene_manager.cpp | 8 ++++++-- 6 files changed, 18 insertions(+), 13 deletions(-) (limited to 'src/crepe/api/SceneManager.h') diff --git a/src/crepe/api/Scene.cpp b/src/crepe/api/Scene.cpp index 88aa82d..849945e 100644 --- a/src/crepe/api/Scene.cpp +++ b/src/crepe/api/Scene.cpp @@ -2,6 +2,4 @@ using namespace crepe; -Scene::Scene(ComponentManager & mgr, const std::string & name) - : component_manager(mgr), - name(name) {} +Scene::Scene(ComponentManager & mgr) : component_manager(mgr) {} diff --git a/src/crepe/api/Scene.h b/src/crepe/api/Scene.h index 6647135..45595c7 100644 --- a/src/crepe/api/Scene.h +++ b/src/crepe/api/Scene.h @@ -19,7 +19,7 @@ protected: * \param mgr Reference to the ComponentManager * \param name Name of the scene */ - Scene(ComponentManager & mgr, const std::string & name); + Scene(ComponentManager & mgr); //! SceneManager instances Scene friend class SceneManager; @@ -29,8 +29,11 @@ public: public: //! Load the scene virtual void load_scene() = 0; - //! The scene name - const std::string name; + /** + * \brief Get the scene's name + * \return The scene's name + */ + virtual std::string get_name() = 0; protected: //! Reference to the ComponentManager diff --git a/src/crepe/api/SceneManager.cpp b/src/crepe/api/SceneManager.cpp index 7fb5cb0..1f783ad 100644 --- a/src/crepe/api/SceneManager.cpp +++ b/src/crepe/api/SceneManager.cpp @@ -18,7 +18,7 @@ void SceneManager::load_next_scene() { auto it = find_if(this->scenes.begin(), this->scenes.end(), [&next_scene = this->next_scene](unique_ptr & scene) { - return scene->name == next_scene; + return scene.get()->get_name() == next_scene; }); // next scene not found diff --git a/src/crepe/api/SceneManager.h b/src/crepe/api/SceneManager.h index 16d6004..ebf77e7 100644 --- a/src/crepe/api/SceneManager.h +++ b/src/crepe/api/SceneManager.h @@ -29,7 +29,7 @@ public: * \param name Name of new scene */ template - void add_scene(const std::string & name); + void add_scene(); /** * \brief Set the next scene * diff --git a/src/crepe/api/SceneManager.hpp b/src/crepe/api/SceneManager.hpp index 714f690..94e5946 100644 --- a/src/crepe/api/SceneManager.hpp +++ b/src/crepe/api/SceneManager.hpp @@ -5,16 +5,16 @@ namespace crepe { template -void SceneManager::add_scene(const std::string & name) { +void SceneManager::add_scene() { using namespace std; static_assert(is_base_of::value, "T must be derived from Scene"); - Scene * scene = new T(this->component_manager, name); + Scene * scene = new T(this->component_manager); this->scenes.emplace_back(unique_ptr(scene)); // The first scene added, is the one that will be loaded at the beginning if (next_scene.empty()) { - next_scene = name; + next_scene = scene->get_name(); } } diff --git a/src/example/scene_manager.cpp b/src/example/scene_manager.cpp index accec7d..ac7f439 100644 --- a/src/example/scene_manager.cpp +++ b/src/example/scene_manager.cpp @@ -20,6 +20,8 @@ public: GameObject object2 = mgr.new_object("scene_1", "tag_scene_1", Vector2{1, 0}, 0, 1); GameObject object3 = mgr.new_object("scene_1", "tag_scene_1", Vector2{2, 0}, 0, 1); } + + string get_name() { return "scene1"; } }; class ConcreteScene2 : public Scene { @@ -33,6 +35,8 @@ public: GameObject object3 = mgr.new_object("scene_2", "tag_scene_2", Vector2{0, 2}, 0, 1); GameObject object4 = mgr.new_object("scene_2", "tag_scene_2", Vector2{0, 3}, 0, 1); } + + string get_name() { return "scene2"; } }; int main() { @@ -40,8 +44,8 @@ int main() { SceneManager scene_mgr{component_mgr}; // Add the scenes to the scene manager - scene_mgr.add_scene("scene1"); - scene_mgr.add_scene("scene2"); + scene_mgr.add_scene(); + scene_mgr.add_scene(); // There is no need to call set_next_scene() at the beginnen, because the first scene will be // automatically set as the next scene -- cgit v1.2.3 From 915341574d9be4ca86dff2b9981c6686477aad53 Mon Sep 17 00:00:00 2001 From: max-001 Date: Thu, 21 Nov 2024 08:51:35 +0100 Subject: Changed comment --- src/crepe/api/SceneManager.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/crepe/api/SceneManager.h') diff --git a/src/crepe/api/SceneManager.h b/src/crepe/api/SceneManager.h index ebf77e7..a20d6a0 100644 --- a/src/crepe/api/SceneManager.h +++ b/src/crepe/api/SceneManager.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include "Scene.h" @@ -42,7 +41,7 @@ public: void load_next_scene(); private: - //! Vector of scenes + //! Vector of concrete scenes (added by add_scene()) std::vector> scenes; //! Next scene to load std::string next_scene; -- cgit v1.2.3 From d3d207b9a2445a9219274466bae2254e1c3db268 Mon Sep 17 00:00:00 2001 From: max-001 Date: Thu, 21 Nov 2024 09:06:52 +0100 Subject: Added SceneManger to LoopManager --- src/crepe/api/LoopManager.h | 13 +++++++++++++ src/crepe/api/LoopManager.hpp | 5 +++++ src/crepe/api/SceneManager.h | 1 - src/example/scene_manager.cpp | 20 +++++++++++--------- 4 files changed, 29 insertions(+), 10 deletions(-) (limited to 'src/crepe/api/SceneManager.h') diff --git a/src/crepe/api/LoopManager.h b/src/crepe/api/LoopManager.h index f6904be..25b833a 100644 --- a/src/crepe/api/LoopManager.h +++ b/src/crepe/api/LoopManager.h @@ -4,6 +4,7 @@ #include "../ComponentManager.h" #include "../system/System.h" +#include "api/SceneManager.h" namespace crepe { @@ -12,6 +13,14 @@ public: void start(); LoopManager(); + /** + * \brief Add a new concrete scene to the scene manager + * + * \tparam T Type of concrete scene + */ + template + void add_scene(); + private: /** * \brief Setup function for one-time initialization. @@ -53,12 +62,14 @@ private: * This function updates physics and game logic based on LoopTimer's fixed_delta_time. */ 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. * @@ -71,6 +82,8 @@ private: private: //! Component manager instance ComponentManager component_manager{}; + //! Scene manager instance + SceneManager scene_manager{component_manager}; private: /** diff --git a/src/crepe/api/LoopManager.hpp b/src/crepe/api/LoopManager.hpp index 0b14fdb..9cf470b 100644 --- a/src/crepe/api/LoopManager.hpp +++ b/src/crepe/api/LoopManager.hpp @@ -10,6 +10,11 @@ namespace crepe { +template +void LoopManager::add_scene() { + this->scene_manager.add_scene(); +} + template T & LoopManager::get_system() { using namespace std; diff --git a/src/crepe/api/SceneManager.h b/src/crepe/api/SceneManager.h index a20d6a0..45ba668 100644 --- a/src/crepe/api/SceneManager.h +++ b/src/crepe/api/SceneManager.h @@ -25,7 +25,6 @@ public: * \brief Add a new concrete scene to the scene manager * * \tparam T Type of concrete scene - * \param name Name of new scene */ template void add_scene(); diff --git a/src/example/scene_manager.cpp b/src/example/scene_manager.cpp index ac7f439..7277afa 100644 --- a/src/example/scene_manager.cpp +++ b/src/example/scene_manager.cpp @@ -1,3 +1,6 @@ +#define private public + +#include "api/LoopManager.h" #include #include @@ -40,22 +43,21 @@ public: }; int main() { - ComponentManager component_mgr{}; - SceneManager scene_mgr{component_mgr}; + LoopManager loop_mgr; // Add the scenes to the scene manager - scene_mgr.add_scene(); - scene_mgr.add_scene(); + loop_mgr.add_scene(); + loop_mgr.add_scene(); // There is no need to call set_next_scene() at the beginnen, because the first scene will be // automatically set as the next scene // Load scene1 (the first scene added) - scene_mgr.load_next_scene(); + loop_mgr.scene_manager.load_next_scene(); // Get the Metadata components of each GameObject of Scene1 vector> metadata - = component_mgr.get_components_by_type(); + = loop_mgr.component_manager.get_components_by_type(); cout << "Metadata components of Scene1:" << endl; // Print the Metadata @@ -65,12 +67,12 @@ int main() { } // Set scene2 as the next scene - scene_mgr.set_next_scene("scene2"); + loop_mgr.scene_manager.set_next_scene("scene2"); // Load scene2 - scene_mgr.load_next_scene(); + loop_mgr.scene_manager.load_next_scene(); // Get the Metadata components of each GameObject of Scene2 - metadata = component_mgr.get_components_by_type(); + metadata = loop_mgr.component_manager.get_components_by_type(); cout << "Metadata components of Scene2:" << endl; // Print the Metadata -- cgit v1.2.3 From 7c21e34ae1898fce8c8051b5f1380e268da32140 Mon Sep 17 00:00:00 2001 From: max-001 Date: Fri, 22 Nov 2024 09:36:35 +0100 Subject: Replaced ComponentManager reference by OptionalRef for late binding --- src/crepe/api/CMakeLists.txt | 1 - src/crepe/api/Scene.cpp | 5 ----- src/crepe/api/Scene.h | 22 ++++++++++++++++------ src/crepe/api/SceneManager.h | 4 ++-- src/crepe/api/SceneManager.hpp | 9 ++++++--- src/test/SceneManagerTest.cpp | 8 ++------ 6 files changed, 26 insertions(+), 23 deletions(-) delete mode 100644 src/crepe/api/Scene.cpp (limited to 'src/crepe/api/SceneManager.h') diff --git a/src/crepe/api/CMakeLists.txt b/src/crepe/api/CMakeLists.txt index d6b6801..4025a63 100644 --- a/src/crepe/api/CMakeLists.txt +++ b/src/crepe/api/CMakeLists.txt @@ -12,7 +12,6 @@ target_sources(crepe PUBLIC SaveManager.cpp Config.cpp Metadata.cpp - Scene.cpp SceneManager.cpp Vector2.cpp Camera.cpp diff --git a/src/crepe/api/Scene.cpp b/src/crepe/api/Scene.cpp deleted file mode 100644 index 849945e..0000000 --- a/src/crepe/api/Scene.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "Scene.h" - -using namespace crepe; - -Scene::Scene(ComponentManager & mgr) : component_manager(mgr) {} diff --git a/src/crepe/api/Scene.h b/src/crepe/api/Scene.h index 869bf6f..22aadab 100644 --- a/src/crepe/api/Scene.h +++ b/src/crepe/api/Scene.h @@ -1,5 +1,6 @@ #pragma once +#include "util/OptionalRef.h" #include namespace crepe { @@ -15,11 +16,8 @@ class ComponentManager; */ class Scene { protected: - //TODO: Use Loek's custom reference class to set ComponentManger via SceneManager instead of via constructor - /** - * \param mgr Reference to the ComponentManager - */ - Scene(ComponentManager & mgr); + // NOTE: This must be the only constructor on Scene, see "Late references" below + Scene() = default; //! SceneManager instances Scene friend class SceneManager; @@ -36,8 +34,20 @@ public: virtual std::string get_name() const = 0; protected: + /** + * \name Late references + * + * These references are set by SceneManager immediately after calling the constructor of Scene. + * + * \note Scene must have a constructor without arguments so the game programmer doesn't need to + * manually add `using Scene::Scene` to their concrete scene class, if they want to add a + * constructor with arguments (e.g. for passing references to their own concrete Scene classes). + * + * \{ + */ //! Reference to the ComponentManager - ComponentManager & component_manager; + OptionalRef component_manager; + //! \} }; } // namespace crepe diff --git a/src/crepe/api/SceneManager.h b/src/crepe/api/SceneManager.h index 45ba668..f6f62cd 100644 --- a/src/crepe/api/SceneManager.h +++ b/src/crepe/api/SceneManager.h @@ -26,8 +26,8 @@ public: * * \tparam T Type of concrete scene */ - template - void add_scene(); + template + void add_scene(Args &&... args); /** * \brief Set the next scene * diff --git a/src/crepe/api/SceneManager.hpp b/src/crepe/api/SceneManager.hpp index 94e5946..1edaa7d 100644 --- a/src/crepe/api/SceneManager.hpp +++ b/src/crepe/api/SceneManager.hpp @@ -4,12 +4,15 @@ namespace crepe { -template -void SceneManager::add_scene() { +template +void SceneManager::add_scene(Args &&... args) { using namespace std; static_assert(is_base_of::value, "T must be derived from Scene"); - Scene * scene = new T(this->component_manager); + Scene * scene = new T(std::forward(args)...); + + scene->component_manager = this->component_manager; + this->scenes.emplace_back(unique_ptr(scene)); // The first scene added, is the one that will be loaded at the beginning diff --git a/src/test/SceneManagerTest.cpp b/src/test/SceneManagerTest.cpp index 1efcfb2..1706de0 100644 --- a/src/test/SceneManagerTest.cpp +++ b/src/test/SceneManagerTest.cpp @@ -12,10 +12,8 @@ using namespace crepe; class ConcreteScene1 : public Scene { public: - using Scene::Scene; - void load_scene() { - auto & mgr = this->component_manager; + ComponentManager & mgr = this->component_manager; GameObject object1 = mgr.new_object("scene_1", "tag_scene_1", Vector2{0, 0}, 0, 1); GameObject object2 = mgr.new_object("scene_1", "tag_scene_1", Vector2{1, 0}, 0, 1); GameObject object3 = mgr.new_object("scene_1", "tag_scene_1", Vector2{2, 0}, 0, 1); @@ -26,10 +24,8 @@ public: class ConcreteScene2 : public Scene { public: - using Scene::Scene; - void load_scene() { - auto & mgr = this->component_manager; + ComponentManager & mgr = this->component_manager; GameObject object1 = mgr.new_object("scene_2", "tag_scene_2", Vector2{0, 0}, 0, 1); GameObject object2 = mgr.new_object("scene_2", "tag_scene_2", Vector2{0, 1}, 0, 1); GameObject object3 = mgr.new_object("scene_2", "tag_scene_2", Vector2{0, 2}, 0, 1); -- cgit v1.2.3