如何从实体组件系统的子类中访问属性

How to access properties from subclasses in an entity component system

本文关键字:子类 访问 属性 系统 实体 组件      更新时间:2023-10-16

我刚开始为一款侧卷轴游戏制作实体组件系统。

我对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>将返回一个空指针,但这需要一些运行时开销(我不会太关心)。

作为旁注,我会认真考虑重新设计,这样就不需要强制转换了。