diff options
Diffstat (limited to 'src/crepe')
| -rw-r--r-- | src/crepe/api/SceneManager.cpp | 41 | ||||
| -rw-r--r-- | src/crepe/api/SceneManager.h | 16 | ||||
| -rw-r--r-- | src/crepe/api/SceneManager.hpp | 2 | 
3 files changed, 41 insertions, 18 deletions
| diff --git a/src/crepe/api/SceneManager.cpp b/src/crepe/api/SceneManager.cpp index 08f036d..57ec302 100644 --- a/src/crepe/api/SceneManager.cpp +++ b/src/crepe/api/SceneManager.cpp @@ -1,3 +1,6 @@ +#include <algorithm> +#include <memory> +  #include "../ComponentManager.h"  #include "SceneManager.h" @@ -5,30 +8,36 @@  using namespace crepe;  using namespace std; -SceneManager::SceneManager() {} -  SceneManager & SceneManager::get_instance() {  	static SceneManager instance;  	return instance;  } -// Set the next scene (this scene will be loaded at the end of the frame) -void SceneManager::set_next_scene(const std::string & name) { +void SceneManager::set_next_scene(const string & name) {  	next_scene = name;  } -// Load a new scene (if there is one)  void SceneManager::load_next_scene() { -	if (!next_scene.empty()) { -		for (auto & scene : scenes) { -			if (scene->name == next_scene) { -				// Delete all components of the current scene -				ComponentManager & mgr = ComponentManager::get_instance(); -				mgr.delete_all_components(); -				// Load the new scene -				scene->load_scene(); -				break; -			} +	// next scene not set +	if (this->next_scene.empty()) +		return; + +	auto it = find_if(this->scenes.begin(), this->scenes.end(), +		[&next_scene = this->next_scene] (unique_ptr<Scene> & scene) { +			return scene->name == next_scene;  		} -	} +	); + +	// next scene not found +	if (it == this->scenes.end()) +		return; +	unique_ptr<Scene> & scene = *it; + +	// Delete all components of the current scene +	ComponentManager & mgr = ComponentManager::get_instance(); +	mgr.delete_all_components(); + +	// Load the new scene +	scene->load_scene();  } + diff --git a/src/crepe/api/SceneManager.h b/src/crepe/api/SceneManager.h index eaf1ba1..1e0e670 100644 --- a/src/crepe/api/SceneManager.h +++ b/src/crepe/api/SceneManager.h @@ -18,13 +18,27 @@ public:  	SceneManager & operator=(SceneManager &&) = delete;  public: +	/** +	 * \brief Add a new concrete scene to the scene manager +	 * +	 * \tparam T  Type of concrete scene +	 * \param name  Name of new scene +	 */  	template <typename T>  	void add_scene(const std::string & name); +	/** +	 * \brief Set the next scene +	 * +	 * This scene will be loaded at the end of the frame +	 * +	 * \param name  Name of the next scene +	 */  	void set_next_scene(const std::string & name); +	//! Load a new scene (if there is one)  	void load_next_scene();  private: -	SceneManager(); +	SceneManager() = default;  private:  	std::vector<std::unique_ptr<Scene>> scenes; diff --git a/src/crepe/api/SceneManager.hpp b/src/crepe/api/SceneManager.hpp index e2ba2da..8bad7b2 100644 --- a/src/crepe/api/SceneManager.hpp +++ b/src/crepe/api/SceneManager.hpp @@ -2,11 +2,11 @@  namespace crepe { -// Add a new concrete scene to the scene manager  template <typename T>  void SceneManager::add_scene(const std::string & name) {  	static_assert(std::is_base_of<Scene, T>::value,  				  "T must be derived from Scene"); +  	scenes.emplace_back(make_unique<T>(name));  	// The first scene added, is the one that will be loaded at the beginning |