Нещодавно я вирішив оновити свою ігрову архітектуру, щоб позбутися глибокої ієрархії класів і замінити їх на налаштовані компоненти. Перша ієрархія, яку я замінюю, - це ієрархія предметів, і я хотів би дізнатися поради, чи я на вірному шляху.
Раніше у мене була ієрархія, яка мала щось подібне:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
Потрібно говорити, що він починав ставати безладним, і це було непросте рішення для предметів, які потребували декількох типів (тобто деяке обладнання використовується для синтезу виробів, деяке обладнання кидає і т.д.)
Потім я спробував перефактурувати та розмістити функціональність у базовий клас елементів. Але тоді я зазначив, що в Елементі є багато невикористаних / зайвих даних. Зараз я намагаюся зробити такий компонент, як архітектура, принаймні для моїх предметів, перш ніж намагатися це зробити для інших моїх ігрових класів.
Ось що я зараз думаю про налаштування компонента:
У мене є базовий клас елемента, який має слоти для різних компонентів (наприклад, слот для компонентів обладнання, слот для загоєння компонентів тощо), а також карту для довільних компонентів).
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;
}
Усі компоненти елемента успадковуватимуться від базового класу ItemComponent, і кожен тип компонентів відповідає за те, щоб повідомити двигуну, як реалізувати цю функціональність. тобто HealingComponent розповідає бойовій механіці, як споживати предмет як цілющий предмет, тоді як ThrowComponent розповідає бойовому двигуну, як ставитися до предмета як до предмета, що кидається.
Карта використовується для зберігання довільних компонентів, які не є основними елементами елемента. Я поєдную його з bool, щоб вказати, чи повинен контейнер елементів керувати ItemComponent або чи ним керує зовнішнє джерело.
Моя ідея тут полягала в тому, що я визначаю основні компоненти, які використовуються моїм ігровим двигуном на передній панелі, і мій заводський елемент присвоює компоненти, якими є предмет, інакше вони є недійсними. Карта міститиме довільні компоненти, які, як правило, додаються / споживаються сценаріями файлів.
Моє запитання, чи це хороший дизайн? Якщо ні, то як це можна покращити? Я розглядав можливість групування всіх компонентів на карті, але використання рядкової індексації видається непотрібним для основних елементів елемента