Son zamanlarda, derin sınıf hiyerarşilerinden kurtulmak ve bunları yapılandırılabilir bileşenlerle değiştirmek için oyun mimarimi yenilemeye karar verdim. Değiştirdiğim ilk hiyerarşi, Öğe hiyerarşisidir ve doğru yolda olup olmadığımı bilmek için bazı tavsiyeler istiyorum.
Daha önce, böyle bir şey gitti bir hiyerarşi vardı:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
Söylemeye gerek yok, dağınık olmaya başladı ve bunlar birden fazla tip olması gereken öğelere kolay bir çözüm değildi (yani bazı ekipman madde sentezinde kullanılır, bazı ekipmanlar atılabilir, vb.)
Sonra refactor ve temel öğe sınıfına işlevsellik yerleştirmeye çalıştı. Ama sonra Öğe'nin bir sürü kullanılmamış / gereksiz veriye sahip olduğunu belirtiyordum. Şimdi mimarlık gibi bir bileşen yapmaya çalışıyorum, en azından diğer oyun sınıflarıma denemeden önce öğelerim için.
Şu anda bileşen kurulumu için düşündüğüm şey:
Çeşitli bileşenler (yani bir ekipman bileşeni yuvası, bir iyileştirme bileşeni yuvası, vb yanı sıra rastgele bileşenler için bir harita) için yuvaları olan bir temel öğe sınıfı var böyle bir şey:
class Item
{
//Basic item properties (name, ID, etc.) excluded
EquipmentComponent* equipmentComponent;
HealingComponent* healingComponent;
SynthesisComponent* synthesisComponent;
ThrowComponent* throwComponent;
boost::unordered_map<std::string, std::pair<bool, ItemComponent*> > AdditionalComponents;
}
Tüm öğe bileşenleri temel bir ItemComponent sınıfından miras alır ve her bir Bileşen tipi motora bu işlevselliğin nasıl uygulanacağını bildirmekten sorumludur. yani HealingComponent, savaş mekaniğine öğeyi iyileştirici bir öğe olarak nasıl kullanacağını söylerken, ThrowComponent savaş motoruna öğeyi atılabilir bir öğe olarak nasıl ele alacağını söyler.
Harita, temel öğe bileşenleri olmayan rastgele bileşenleri depolamak için kullanılır. Öğe Kapsayıcısı ItemComponent yönetmek veya harici bir kaynak tarafından yönetiliyor olup olmadığını belirtmek için bir bool ile eşleştiriyorum.
Buradaki fikrim, oyun motorum tarafından kullanılan temel bileşenleri önceden tanımladığım ve ürün fabrikamın, öğenin gerçekte sahip olduğu bileşenleri atayacağıydı, aksi takdirde null. Harita genellikle komut dosyaları tarafından eklenecek / tüketilecek keyfi bileşenler içerecektir.
Sorum şu: Bu iyi bir tasarım mı? Değilse, nasıl geliştirilebilir? Tüm bileşenleri haritaya gruplandırmayı düşündüm, ancak çekirdek öğe bileşenleri için dize indeksleme kullanmak gereksiz görünüyordu