簡體   English   中英

為我的2D C ++游戲實現組件系統

[英]Implementing a component System for my 2d C++ game

我一直在嘗試為簡單的2D格斗游戲實現一種組件系統的方法,在該系統中,我可以輕松地交換系統功能返回的新組件。 我的想法是,我有很多系統功能可以在一組組件上運行:

例:

PosisiontComponent MovementSystem(PositionComponent pos, VelocityComponent vel)
{
    //..Make entity move
   return pos;
}

這里的關鍵是我想返回該組件的新副本,而不是直接在我的系統函數中修改狀態(以便於理解和測試系統)。 理想情況下,可以通過某種myFighter.Insert()成員函數將該新更新的位置組件插入到我的Fighter中(其行為基本上像實體類)。 到目前為止,我正在考慮使用std::map<int key, Component* comp>存儲我的組件,該鍵是唯一的ID,僅與一種組件類型相關聯,我可以使用它來查找某些組件在地圖內。 戰斗機類可能類似於:

class Fighter
{
public:
    void Insert(Component* comp);
    Component* Get();

    std::map<int, Component*> componentMap;
}

Fighter::Fighter(std::string const imageFilePath, float startPositionX, float startPositionY) :
    sprite(imageFilePath, 200, 200)
{
    componentMap[0] = new PositionComponent(glm::vec2{ 0.0f, 0.0f });
    componentMap[1] = new VelocityComponent();
}

void Fighter::Insert(Component* component)
{
    componentMap.erase(compID);
    componentMap[compID)] = component;
}

Component* GetComponent()
{
   return componentMap[id];
}

我遇到的問題是我不太了解如何在當前實現中通過GetComponent()函數返回單個組件(當前由於類型問題的轉換而導致編譯器錯誤)。

我的問題是:

1.)我當前的實施方案是否可行? 有沒有一種方法可以從GetComponent()函數中提取特定組件,而不會出現編譯器問題? 如果沒有,有什么更好的方法可以輕松替換我的Fighter類中的各個組件?

假設每個實體每種類型只能有一個組件,則可以使用模板。

template<typename T>
T* getComponent() {
    for (auto &component : components)
    {
        T* derivedComponent = dynamic_cast<T*>(component);
        if (derivedComponent)
        {
            return derivedComponent;
        }
    }

    return NULL;
}

然后使用它會很簡單,並且不需要共享ID。 同樣,可以在不中斷游戲的情況下更改地圖的順序。 這是在運行時添加和刪除組件時發生的。

Fighter* f;
PosisiontComponent* positionComponent = f->getComponent<PosisiontComponent>();

這是我過去使用的方法,並且效果很好。 但是,我建議為這些容器使用智能指針,而不是原始指針。

暫無
暫無

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

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