您可能已經聽說過Entity Component System,其中一切都是Entity
,並且每個實體都有一個控制其功能的列表Component
。如何將不同的對象存儲在數組中並獲取某種類型的對象?
我想了解如何將不同的對象(每個繼承Component
)存儲在一個數組中,並能夠根據它們的類型從該數組中獲取對象。
我能想到的第一解決方案是具有用於對象類型enum
繼承部件:
enum ComponentType : unsigned char // There will never be more than 256 components
{
EXAMPLE_COMPONENT,
ANOTHER_EXAMPLE_COMPONENT,
AND_ANOTHER_EXAMPLE_COMPONENT
};
然後Component
基類與吸氣劑一ComponentType type;
,並且每個子組件設置其類型例如:
ExampleComponent::ExampleComponent()
{
type = EXAMPLE_COMPONENT;
}
然後我就會有一個GetComponent
功能:
Component* Entity::GetComponent(ComponentType type)
{
for (unsigned int i = 0; i < m_components.size(); i++)
{
if (m_components.at(i).GetType() == type)
{
return &m_components.at(i);
}
}
return nullptr;
}
// Note: m_components is an std::vector;
然後最後你會打電話GetComponent
如:
(ExampleComponent*) component = entity.GetComponent(EXAMPLE_COMPONENT);
這裏的問題是,你需要一個enum
爲每種類型的組件,你也可以選擇使用GetComponent
確保你後施放組件可以訪問自己的成員變量。
有沒有人知道在沒有必要使用enum
的情況下進行此操作的正確方法,並且不需要投射組件?如果有一個解決方案仍然需要在每個組件中存儲一個類型變量,它最好是一個字節,不能大於4個字節。
編輯:我也不想提前使用模板
謝謝!
大衛
我會用'std :: find_if'和一個lambda替換'Entity :: GetComponent'中的原始循環。我也將'NULL'的使用改爲'nullptr'並且擺脫了C風格的轉換'(ExampleComponent *)',並用適當的C++轉換替換它。也; 'void *'是討厭的 - 爲什麼不返回基類指針呢? –
模板和'dynamic_cast'? – Jarod42
對我來說,似乎你的'enum'模擬多態性。通過創建派生類來使用真正的多態。 –