如何从实体组件系统的子类中访问属性
How to access properties from subclasses in an entity component system
我刚开始为一款侧卷轴游戏制作实体组件系统。
我对c++很陌生,但我已经阅读了很多教程,并决定最好的方法是有一个包含组件向量的实体类。然后就会有一个基组件类,实际的组件作为子类。
Entity.h:
#ifndef _ENTITY_H
#define _ENTITY_H
#include "header.h"
class Entity
{
public:
Entity();
~Entity();
// Vector which stores all added components
vector<Component*> Components;
// Add component method
void AddComponent(Component* component);
};
#endif
Entity.cpp:
#include "header.h"
#include "Component.h"
#include "Entity.h"
Entity::Entity(){}
Entity::~Entity(){}
void Entity::AddComponent(Component* component)
{
Components.push_back(component);
}
Component.h:
#ifndef _COMPONENT_H
#define _COMPONENT_H
#include "header.h"
class Component
{
public:
// Forward declaration
class Entity;
Component();
~Component();
void Connect(Entity* entity) {}
string Name;
};
// Position component
class Position: public Component{
public:
int x, y;
};
// Display component
class Display: public Component{
public:
sf::Sprite baseSprite; };
#endif
Component.cpp:
#include "header.h"
#include "Component.h"
Component::Component(){}
Component::~Component(){}
现在添加一个新组件,我将这样做:
Entity* new_component;
new_component = new Entity;
new_component->AddComponent(new Position);
new_component->AddComponent(new Display);
问题是,我不知道如何实际访问组件,一旦我添加它。
我希望能够访问,例如,位置的x和y值。但是当我尝试像这样访问列表中的组件时:
Components[i]->...
我只想到了基组件类的属性。
您可以将某些类型的组件存储在某个索引中。例如,所有位置分量存储在位置0,所有速度分量存储在位置1。
然后您可以轻松检索组件
template <class T>
T * Entity::getComponent()
{
return static_cast<T*>(components[T::getIndex()]);
}
Component::getIndex()是一个静态方法,它应该返回该组件的索引。
在访问派生类的方法之前,使用static_cast<T>
或dynamic_cast<T>
将vector元素强制转换为合适的类型。
要使用static_cast<T>
,您必须记住哪个元素属于哪个类型,因为static_cast<T>
不会告诉您。
T
不是合适的指针类型, dynamic_cast<T>
将返回一个空指针,但这需要一些运行时开销(我不会太关心)。
作为旁注,我会认真考虑重新设计,这样就不需要强制转换了。
相关文章:
- 通过指向指针数组的指针访问子类的属性
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 如何在C++子类中访问父类的私有变量
- 从子类访问模板类成员时出现"找不到标识符"错误
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- 如何访问子类的新成员函数?
- 从父类的向量访问子类函数,而无需向下转换
- 从模板化类中的子类访问定义
- 有没有更好的方法可以从子类访问父类的变量?
- 从子类访问私有继承类的名称
- C++:从子类访问父类
- 通过C++中的子类访问超类的受保护静态成员
- 为什么从子类访问超类的其他示例的字段会导致该字段崩溃
- C++子类访问主类变量
- 无法从子类访问QMainWindow变量
- 如何从继承子类访问基类中的私有成员(c++)
- c++子类访问
- 从子类的子类访问父成员
- C++公共非虚拟基类方法无法从子类访问
- 子类访问彼此的成员函数