如何索引实体中基本组件列表中的所有派生组件
How to index all the derived components in a base component list in Entity
我正在尝试为仿真进行实体组件系统设计。这就是现在让我困惑的地方。
我正在尝试创建一个实体 class
Entity.h
class Entity
{
public:
Entity();
virtual ~Entity() = 0;
//---------------------Methods---------------------//
void AddComponent(const shared_ptr<Component> component);
template<class T>
T* GetComponent() const;
//---------------------Members---------------------//
vector<shared_ptr<Component>> m_components;
}
Entity.cpp
template<typename T>
T* Entity::GetComponent() const
{
Component::component_type_t typeIndex = /*T::component_type*/
T* returnPtr = dynamic_pointer_cast<T>(m_components[component_type].get());
return returnPtr;
}
组件 class 看起来像这样
class Component
{
public:
Component();
virtual ~Component() = 0;
//---------------------Methods---------------------//
//---------------------Members---------------------//
typedef enum component_type_t
{
MESH_T,
RIGIDBODY_T,
TRANSFORM_T,
NUM_TYPES
};
component_type_t componentType;
};
我想使用的方式 GetComponent()
与 Unity3D 中的相同
Transform* t = GetComponent<Transform>()
但是如您所见,我还找不到实现该操作的方法。我过去的做法是
class Entity
{
.....
Component* GetComponent(Component::component_type_t componentType) const
{
return m_components[component_type].get()
};
}
而且我只能将其用作
Transform* t = dynamic_pointer_cast<Transform>(GetComponent(Component::component_type_t::TRANSFORM_T));
显然很乏味。
所以我的问题是我可以像这样使用某种形式吗?
class Entity
{
.....
template<class T>
T* GetComponent() const
{
Component::component_type_t typeIndex = /*T::component_type*/
T* returnPtr = dynamic_pointer_cast<T>(m_components[component_type].get());
return returnPtr;
};
}
我觉得继续使用 std::vector<>
来存储我所有的组件指针的清洁和速度,这也是一个有效的设计吗?
很久以前做过类似的事情。我认为你这样做很困难。您可以轻松修改下面的代码以满足您的需要。 Components
是继承的。您可以删除继承并将其替换为 class 内的 class 或 Component
class.
内的所有组件 classes
#include <iostream>
struct Vector3
{
float x, y, z;
Vector3(float x, float y){}
Vector3(float x, float y,float z){}
};
template <class T>
class Component
{
public:
T t;
void adNewComponent(){
}
};
class Mesh{
public:
Mesh(){}
};
class Rigidbody{
public:
Rigidbody(){}
void AddForce(float x,float y, float z){}
void AddForce(Vector3 force){}
};
class Transform{
public:
Transform(){}
};
class Object{
};
class GameObject:Object,
Component<Mesh>,
Component<Rigidbody>,
Component<Transform>
{
public:
template <class T>
T &GetComponent()
{
return this->Component<T>::t;
}
template <class T>
T &AddComponent(){
this->Component<T>::adNewComponent();
return this->Component<T>::t;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
GameObject gameObject;
gameObject.AddComponent<Rigidbody>();
Rigidbody rigidBody = gameObject.GetComponent<Rigidbody>();
rigidBody.AddForce(9,0,0);
std::cin.get();
return 0;
}
我正在尝试为仿真进行实体组件系统设计。这就是现在让我困惑的地方。 我正在尝试创建一个实体 class
Entity.h
class Entity
{
public:
Entity();
virtual ~Entity() = 0;
//---------------------Methods---------------------//
void AddComponent(const shared_ptr<Component> component);
template<class T>
T* GetComponent() const;
//---------------------Members---------------------//
vector<shared_ptr<Component>> m_components;
}
Entity.cpp
template<typename T>
T* Entity::GetComponent() const
{
Component::component_type_t typeIndex = /*T::component_type*/
T* returnPtr = dynamic_pointer_cast<T>(m_components[component_type].get());
return returnPtr;
}
组件 class 看起来像这样
class Component
{
public:
Component();
virtual ~Component() = 0;
//---------------------Methods---------------------//
//---------------------Members---------------------//
typedef enum component_type_t
{
MESH_T,
RIGIDBODY_T,
TRANSFORM_T,
NUM_TYPES
};
component_type_t componentType;
};
我想使用的方式 GetComponent()
与 Unity3D 中的相同
Transform* t = GetComponent<Transform>()
但是如您所见,我还找不到实现该操作的方法。我过去的做法是
class Entity
{
.....
Component* GetComponent(Component::component_type_t componentType) const
{
return m_components[component_type].get()
};
}
而且我只能将其用作
Transform* t = dynamic_pointer_cast<Transform>(GetComponent(Component::component_type_t::TRANSFORM_T));
显然很乏味。
所以我的问题是我可以像这样使用某种形式吗?
class Entity
{
.....
template<class T>
T* GetComponent() const
{
Component::component_type_t typeIndex = /*T::component_type*/
T* returnPtr = dynamic_pointer_cast<T>(m_components[component_type].get());
return returnPtr;
};
}
我觉得继续使用 std::vector<>
来存储我所有的组件指针的清洁和速度,这也是一个有效的设计吗?
很久以前做过类似的事情。我认为你这样做很困难。您可以轻松修改下面的代码以满足您的需要。 Components
是继承的。您可以删除继承并将其替换为 class 内的 class 或 Component
class.
#include <iostream>
struct Vector3
{
float x, y, z;
Vector3(float x, float y){}
Vector3(float x, float y,float z){}
};
template <class T>
class Component
{
public:
T t;
void adNewComponent(){
}
};
class Mesh{
public:
Mesh(){}
};
class Rigidbody{
public:
Rigidbody(){}
void AddForce(float x,float y, float z){}
void AddForce(Vector3 force){}
};
class Transform{
public:
Transform(){}
};
class Object{
};
class GameObject:Object,
Component<Mesh>,
Component<Rigidbody>,
Component<Transform>
{
public:
template <class T>
T &GetComponent()
{
return this->Component<T>::t;
}
template <class T>
T &AddComponent(){
this->Component<T>::adNewComponent();
return this->Component<T>::t;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
GameObject gameObject;
gameObject.AddComponent<Rigidbody>();
Rigidbody rigidBody = gameObject.GetComponent<Rigidbody>();
rigidBody.AddForce(9,0,0);
std::cin.get();
return 0;
}