簡體   English   中英

基於組件的體系結構c ++

[英]Component based architecture c++

我無法找到在c ++中制作基於組件的引擎架構的方法。 但我無法找到一種方法來組合組件的向量與從組件派生的類。

我想覆蓋組件虛函數。 但是,我可以調用覆蓋函數的唯一方法是使組件派生類成為指針,但我希望每個游戲對象在向量中包含自己的組件,而不是作為指針在類外部。

我試圖刪除盡可能多的不必要的代碼。

我的結構:

//GameObject class, contains components and other objects
class GameObject
{
public:

    GameObject(){}
    ~GameObject(){}

    void AddChild(GameObject child)
    {
       children.push_back(child);
    }
    void AddComponent(Component component)
    {
       components.push_back(component);
    }

    void Input(){}
    void Update(){}
    void Render()
    {
       for(unsigned int i = 0; i < components.size(); i++)
            components[i].Render();
    }

private:

    std::vector<GameObject> children;
    std::vector<Component> components;
};

//base class component
class Component
{
public:
    Component(){}
    ~Component(){}

    virtual void Input(){}
    virtual void Update(){}
    virtual void Render(){ cout << "Component -> Render()" << endl; }

};

class MeshRenderer : public Component
{
public:
    MeshRenderer(Mesh _mesh, Material _material)
    {
        mesh = _mesh;
        material = _material
    }

    ~MeshRenderer(){}

    //override components virtual Render()
    void Render(Transform transform)
    {
        mesh.Render(material);
        cout << "MeshRenderer -> Render()" << endl;
    }

private:
    Mesh mesh;
    Material material;
};

GameObject* root = new GameObject();
MeshRenderer meshRenderer(mesh, material);

root->AddComponent(meshRenderer);

//GameLoop
while(!quit)
{
   root->Render();
}

看起來你想通過引用傳遞你的對象,使用

void AddComponent(Component& component);

避免任何切片


為了正確使用std::vector<>和多態繼承,你需要智能指針,例如std::unique_ptr<Component>來保留所有權,或者std::shared_ptr<Component>用於共享所有權(原始指針為Component*也可以正常工作,但要正確管理起來要困難得多。

void AddComponent(std::unique_ptr<Component> componentPtr); // Unique ownership

要么

void AddComponent(std::shared_ptr<Component> componentPtr); // Shared ownership

因此

std::vector<std::unique_ptr<Component>> components;

要么

std::vector<std::shared_ptr<Component>> components;

如果這些Component實例應該由它們的聚合父GameObject類唯一擁有,則它取決於您的實際用例。


要使用std::shared<>指針,它們可以在其使用范圍之外到期,您可以考慮使用std::weak_ptr<>

如上所述,它完全取決於您的用例,以及您希望如何從GameObject類外部訪問這些聚合組件。

如果你可以使用unique_ptr那將是最好的:

void AddComponent(std::unique_ptr<Component> component) {
    components.push_back(std::move(component));
}

std::vector<std::unique_ptr<Component>> components;

因此,通過調用AddComponent()您可以將組件的所有權轉移到包含GameObject

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM