我刚刚开始为一个sidescroller游戏开发一个实体组件系统。
我对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);
问题是,我不知道在添加组件后如何再次实际访问组件。
我希望能够访问例如Position的x和y值。但是,当我尝试访问列表中的组件时,如下所示:
Components[i]->...
我只想出基础组件类的属性。
非常感谢任何帮助。
答案 0 :(得分:1)
您可以在特定索引中存储某些类型的组件。 例如,所有位置组件都存储在位置0中,所有速度组件都存储在位置1中。
然后您可以轻松检索组件
template <class T>
T * Entity::getComponent()
{
return static_cast<T*>(components[T::getIndex()]);
}
Component :: getIndex()是一个静态方法,应该返回该组件的索引。
答案 1 :(得分:0)
在访问派生类的方法之前,使用static_cast<T>
或dynamic_cast<T>
将vector元素强制转换为适当的类型。
要使用static_cast<T>
,您必须记住哪个元素属于哪种类型,因为static_cast<T>
不会告诉您。
dynamic_cast<T>
不是适当的指针类型, T
将返回空指针,但这需要一些运行时开销(我不会太担心)。
作为旁注,我会认真考虑重新设计,以便不需要施法。