1

不久前,我开始创作游戏,并遇到了我真正喜欢的风格。它被称为基于组件的架构。本教程适用于 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

我还没有定义这些函数,所以我没有包含实现文件。

ComponentReferencestruct 只是用于定位特定组件的整数和字符串的集合。实体会将 a 传递ComponentReference给 in 的模板化函数manager,该函数将在其内部列表中搜索特定对象。还有砖墙。我不知道如何创建一个列表,其中包含未知数量的不同未知类型的对象。它们是从父类派生的Component,但它们都包含不同的函数和成员变量。我尝试使用指针数组和类型转换,但三个小时后,当我读到过度依赖类型转换是代码编写错误的指标时,我放弃了。

我尝试使用 STL 容器,但它们只需要一种类型,因此显然它们不起作用(带有指向模板类的指针的 C++ std::vector

我看到了一些关于包装器的东西,但从我读到的,它们似乎只适用于函数:(c++ 存储一个指向未知类成员函数的指针)如果它们可以用来解决我的问题,请解释它们是如何工作的(我'在今天之前从未听说过他们)

由于这是我的第一个问题,请随时留下反馈。我做了研究,但如果这是重复的,我很抱歉。我对 C++ 并不陌生,但我也不是专家,而且它是一门大语言,所以我可能会要求澄清。提前致谢!

4

0 回答 0