Niedawno postanowiłem odnowić architekturę gry, aby pozbyć się głębokich hierarchii klas i zastąpić je konfigurowalnymi komponentami. Pierwszą hierarchią, którą zastępuję, jest hierarchia przedmiotów i chciałbym uzyskać porady, czy jestem na dobrej drodze.
Wcześniej miałem hierarchię, która wyglądała mniej więcej tak:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
Nie trzeba dodawać, że zaczynał się robić bałagan i nie było to łatwe rozwiązanie dla przedmiotów, które musiały być różnego rodzaju (tj. Niektóre urządzenia są używane do syntezy przedmiotów, niektóre mogą być rzucane itp.)
Następnie spróbowałem przefakturować i umieścić funkcjonalność w podstawowej klasie przedmiotów. Ale potem zauważyłem, że Przedmiot miał dużo nieużywanych / zbędnych danych. Teraz próbuję stworzyć komponent taki jak architektura, przynajmniej dla moich przedmiotów, zanim spróbuję zrobić to z innymi klasami gier.
Oto, co obecnie myślę o konfiguracji składników:
Mam podstawową klasę przedmiotów, która ma miejsca na różne elementy (tj. Miejsce na wyposażenie, miejsce na leczenie, itp., A także mapę na dowolne elementy), więc coś takiego:
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;
}
Wszystkie elementy elementu odziedziczą po podstawowej klasie ItemComponent, a każdy typ elementu odpowiada za poinformowanie silnika, jak zaimplementować tę funkcję. tzn. HealingComponent mówi mechanikom bitewnym, jak spożywać przedmiot jako przedmiot leczący, podczas gdy ThrowComponent mówi silnikowi bitewnemu, jak traktować przedmiot jako przedmiot rzucany.
Mapa służy do przechowywania dowolnych składników, które nie są podstawowymi elementami. Łączę go z boolem, aby wskazać, czy pojemnik na przedmioty powinien zarządzać ItemComponent, czy też jest zarządzany przez zewnętrzne źródło.
Mój pomysł polegał na tym, że zdefiniowałem podstawowe komponenty używane przez mój silnik gry, a moja fabryka przedmiotów przypisałaby komponenty, które faktycznie mają przedmiot, w przeciwnym razie są one zerowe. Mapa zawierałaby dowolne komponenty, które generalnie byłyby dodawane / używane przez pliki skryptów.
Moje pytanie brzmi: czy to dobry projekt? Jeśli nie, jak można to poprawić? Rozważałem grupowanie wszystkich komponentów na mapie, ale użycie indeksowania ciągów wydawało się niepotrzebne w przypadku podstawowych elementów
źródło