[英]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.