diff options
Diffstat (limited to 'mwe/ecs-homemade/inc')
| -rw-r--r-- | mwe/ecs-homemade/inc/ComponentManager.h | 2 | ||||
| -rw-r--r-- | mwe/ecs-homemade/inc/ComponentManager.hpp | 4 | ||||
| -rw-r--r-- | mwe/ecs-homemade/inc/Components.h | 33 | ||||
| -rw-r--r-- | mwe/ecs-homemade/inc/Components.hpp | 20 | ||||
| -rw-r--r-- | mwe/ecs-homemade/inc/GameObjectMax.h | 2 | ||||
| -rw-r--r-- | mwe/ecs-homemade/inc/GameObjectMax.hpp | 4 | 
6 files changed, 60 insertions, 5 deletions
diff --git a/mwe/ecs-homemade/inc/ComponentManager.h b/mwe/ecs-homemade/inc/ComponentManager.h index d368516..2cdbb66 100644 --- a/mwe/ecs-homemade/inc/ComponentManager.h +++ b/mwe/ecs-homemade/inc/ComponentManager.h @@ -18,7 +18,7 @@ public:  	ComponentManager & operator=(ComponentManager &&) = delete; //Singleton  	template <typename T, typename... Args> -	void AddComponent(std::uint32_t id, +	T& AddComponent(std::uint32_t id,  					  Args &&... args); //Add a component of a specific type  	template <typename T>  	void DeleteComponentsById( diff --git a/mwe/ecs-homemade/inc/ComponentManager.hpp b/mwe/ecs-homemade/inc/ComponentManager.hpp index d6da8e8..a120ab1 100644 --- a/mwe/ecs-homemade/inc/ComponentManager.hpp +++ b/mwe/ecs-homemade/inc/ComponentManager.hpp @@ -1,6 +1,6 @@  template <typename T, typename... Args> -void ComponentManager::AddComponent(std::uint32_t id, Args &&... args) { +T& ComponentManager::AddComponent(std::uint32_t id, Args &&... args) {  	std::type_index type = typeid(  		T); //Determine the type of T (this is used as the key of the unordered_map<>) @@ -21,6 +21,8 @@ void ComponentManager::AddComponent(std::uint32_t id, Args &&... args) {  	mComponents[type][id].push_back(std::make_unique<T>(std::forward<Args>(  		args)...)); //Create a new component of type T using perfect forwarding and store its unique_ptr in the vector<> + +	return static_cast<T&>(*mComponents[type][id].back().get());  }  template <typename T> diff --git a/mwe/ecs-homemade/inc/Components.h b/mwe/ecs-homemade/inc/Components.h index 98c5fe7..b392fd0 100644 --- a/mwe/ecs-homemade/inc/Components.h +++ b/mwe/ecs-homemade/inc/Components.h @@ -1,6 +1,7 @@  #pragma once  #include <string> +#include <memory>  class Component {  public: @@ -31,3 +32,35 @@ public:  	int mSize;  }; + +class IBehaviour { +public: +	virtual ~IBehaviour() = default; +	virtual void onStart() = 0; +	virtual void onUpdate() = 0; +}; + +template<typename T> +class BehaviourWrapper : public IBehaviour { +public: +	BehaviourWrapper(); +	void onStart() override; +	void onUpdate() override; + +private: +	T instance; +}; + +class BehaviourScript : public Component { +public: +	template<typename T> +	void addScript(); + +	void onStart(); +	void onUpdate(); + +private: +	std::unique_ptr<IBehaviour> behaviour; +}; + +#include "Components.hpp" diff --git a/mwe/ecs-homemade/inc/Components.hpp b/mwe/ecs-homemade/inc/Components.hpp new file mode 100644 index 0000000..85da5a5 --- /dev/null +++ b/mwe/ecs-homemade/inc/Components.hpp @@ -0,0 +1,20 @@ +#include "Components.h" +#include <iostream> + +template<typename T> +BehaviourWrapper<T>::BehaviourWrapper()  : instance() {} + +template<typename T> +void BehaviourWrapper<T>::onStart() { +	instance.onStart(); +} + +template<typename T> +void BehaviourWrapper<T>::onUpdate() { +	instance.onUpdate(); +} + +template<typename T> +void BehaviourScript::addScript() { +	behaviour = std::make_unique<BehaviourWrapper<T>>(); +} diff --git a/mwe/ecs-homemade/inc/GameObjectMax.h b/mwe/ecs-homemade/inc/GameObjectMax.h index 3029053..c6af50a 100644 --- a/mwe/ecs-homemade/inc/GameObjectMax.h +++ b/mwe/ecs-homemade/inc/GameObjectMax.h @@ -8,7 +8,7 @@ public:  	GameObject(std::uint32_t id, std::string name, std::string tag, int layer);  	template <typename T, typename... Args> -	void AddComponent(Args &&... args); +	T& AddComponent(Args &&... args);  	std::uint32_t mId;  	std::string mName; diff --git a/mwe/ecs-homemade/inc/GameObjectMax.hpp b/mwe/ecs-homemade/inc/GameObjectMax.hpp index 91d51ea..4104589 100644 --- a/mwe/ecs-homemade/inc/GameObjectMax.hpp +++ b/mwe/ecs-homemade/inc/GameObjectMax.hpp @@ -1,7 +1,7 @@  #include "ComponentManager.h"  template <typename T, typename... Args> -void GameObject::AddComponent(Args &&... args) { -	ComponentManager::GetInstance().AddComponent<T>( +T& GameObject::AddComponent(Args &&... args) { +	return ComponentManager::GetInstance().AddComponent<T>(  		mId, std::forward<Args>(args)...);  }  |