不久前,我开始创作游戏,并遇到了我真正喜欢的风格。它被称为基于组件的架构。本教程适用于 Objective-C,而不是 C++,但无论如何我都包含了链接: http ://www.raywenderlich.com/24878/introduction-to-component-based-architecture-in-games
我注意到我正在从一个项目到另一个项目复制和粘贴大量代码,所以我决定只为通用框架创建一个库。通常,组件包含在实体对象中,如下所示:
#ifndef ENTITY_H
#define ENTITY_H
#include "HealthComponent.h"
#include "MoveComponent.h"
#include "PlayerComponent.h"
#include "RenderComponent.h"
class Entity
{
public:
Entity();
HealthComponent* getHealth();
//Returns a reference to the object's health component
//If there is none, returns a null pointer
MoveComponent* getMove();
//Returns a reference to the object's movement component
//If there is none, returns a null pointer
PlayerComponent* getPlayer();
//Returns a reference to the object's player component
//If there is none, returns a null pointer
RenderComponent* getRender();
//Returns a reference to the object's render component
//If there is none, returns a null pointer
~Entity();
private:
HealthComponent* health;
MoveComponent* move;
PlayerComponent* player;
RenderComponent* render;
};
#endif //ENTITY_H
由于我的库将包含通用框架,而不是单个组件,因此此方法不再适用。相反,我创建了一个ComponentManager
类来管理我的组件。目前,实体如下所示:
#ifndef ENTITY_H
#define ENTITY_H
#include "Component.h"
#include "ComponentManager.h"
#include <list>
class Entity
{
public:
Entity();
Entity(ComponentManager const & cmanager);
template <T>
T* getComponent();
//Returns the first component of the specified type
//If there is none, returns NULL
template <T>
T* getComponent(int i);
//Returns the ith component of the specified type
//If the component does not exist, returns NULL
template<T>
int getComponentCount();
//Returns the number of components of the specific type that the
//entity contains
template <T>
int addComponent(T &component);
//Adds a component of the specified type to the class. If a component of the
//class already exists, the component is assigned a number, and the number is returned.
//If no components of the class exist, 0 is returned
~Entity();
private:
int eid;
std::list<ComponentReference> components;
ComponentManager * manager;
};
#endif //ENTITY
我还没有定义这些函数,所以我没有包含实现文件。
ComponentReference
struct 只是用于定位特定组件的整数和字符串的集合。实体会将 a 传递ComponentReference
给 in 的模板化函数manager
,该函数将在其内部列表中搜索特定对象。还有砖墙。我不知道如何创建一个列表,其中包含未知数量的不同未知类型的对象。它们是从父类派生的Component
,但它们都包含不同的函数和成员变量。我尝试使用指针数组和类型转换,但三个小时后,当我读到过度依赖类型转换是代码编写错误的指标时,我放弃了。
我尝试使用 STL 容器,但它们只需要一种类型,因此显然它们不起作用(带有指向模板类的指针的 C++ std::vector)
我看到了一些关于包装器的东西,但从我读到的,它们似乎只适用于函数:(c++ 存储一个指向未知类成员函数的指针)如果它们可以用来解决我的问题,请解释它们是如何工作的(我'在今天之前从未听说过他们)
由于这是我的第一个问题,请随时留下反馈。我做了研究,但如果这是重复的,我很抱歉。我对 C++ 并不陌生,但我也不是专家,而且它是一门大语言,所以我可能会要求澄清。提前致谢!