#pragma once #include "SceneManager.h" #include #include namespace dae { class GameObject; class Scene final { friend Scene& SceneManager::CreateScene(const std::string& name); public: void Add(GameObject* object); void Remove(std::shared_ptr object); void RemoveAll(); void Update(float deltaTime); void FixedUpdate(float deltaTime); void LateUpdate(float deltaTime); void Render() const; void DeleteMarkedGameObjects(); void DeleteMarkedGameObjectsRecursive(std::shared_ptr gameObject); void HandleChangeParents(); unsigned int GetId() const { return m_Id; } std::string GetName() const { return m_Name; } void SetRestartFunction(std::function restartFunction) { m_RestartFunction = restartFunction; } void Restart() { m_RestartFunction(); } GameObject* GetRootGameObject() { if (!m_pGameObjects.empty()) return m_pGameObjects[0].get(); else return nullptr; } GameObject* FindChild(const std::string& name); GameObject* FindChildRecursive(const std::shared_ptr& gameObject, const std::string& name); std::vector FindChildren(const std::string& name); void FindChildrenRecursive(const std::shared_ptr& gameObject, const std::string& name, std::vector& outChildren); ~Scene(); Scene(const Scene& other) = delete; Scene(Scene&& other) = delete; Scene& operator=(const Scene& other) = delete; Scene& operator=(Scene&& other) = delete; private: explicit Scene(const std::string& name); static unsigned int m_Count; std::string m_Name; unsigned int m_Id; std::vector > m_pGameObjects{}; std::function m_RestartFunction; }; }