Po przejrzeniu kilku wzorców projektowania gier, zdecydowałem się na Entity-Component-System (ES System) dla mojego silnika gry. Czytam artykuły (głównie T = Maszyna ) i przeglądam kod źródłowy i myślę, że mam dość, aby zacząć.
Jest tylko jeden podstawowy pomysł, z którym się zmagam. Jak postępować z grupami podmiotów, które są od siebie zależne?
Pozwól mi skorzystać z przykładu:
Załóżmy, że tworzę standardową strzelankę (myślę Jamestown ) i chcę zbudować „byt boski” z wieloma odrębnymi, ale połączonymi częściami. Podział może wyglądać mniej więcej tak:
- Korpus statku: ruch, renderowanie
- Cannon: Pozycja (zablokowana względem ciała statku), Śledzenie \ Ogień w bohaterze, Przyjmowanie obrażeń do momentu wyłączenia
- Rdzeń: Pozycja (zablokowana względem korpusu statku), Śledzenie \ Ogień w bohaterze, Przyjmowanie obrażeń do momentu wyłączenia, Wyłączanie (er ... niszczenie) wszystkich innych istot w grupie statków
Moim celem będzie coś, co zostanie zidentyfikowane (i zmanipulowane) jako odrębny element gry bez konieczności przepisywania podsystemu od podstaw za każdym razem, gdy chcę zbudować nowy element agregujący.
Jak wdrożyć tego rodzaju projekt w ES System?
- Czy wdrażam jakiś rodzaj relacji rodzic-dziecko (byty mogą mieć dzieci)? To wydaje się być sprzeczne z metodologią polegającą na tym, że Jednostki są tylko pustymi pojemnikami i sprawia, że wydaje się bardziej OOP.
- Czy zaimplementuję je jako osobne jednostki, z jakimś rodzajem łączenia Component (BossComponent) i powiązanego systemu (BossSubSystem)? Nie mogę przestać myśleć, że będzie to trudne do wdrożenia, ponieważ sposób komunikacji komponentów wydaje się być wielką pułapką na niedźwiedzie.
- Czy implementuję je jako jeden byt z kolekcją komponentów (ShipComponent, CannonComponents, CoreComponent)? Ten wydaje się odwracać intencję Systemu ES (tutaj komponenty wydają się zbyt podobne do jednostek o dużej wadze), ale wiem o tym, więc pomyślałem, że to tam przedstawię.
- Czy wdrażam je jako coś innego, o czym wspomniałem?
Wiem, że można to bardzo łatwo wdrożyć w OOP, ale wybiorę ES zamiast OOP, z którym będę się trzymał. Jeśli będę musiał zerwać z teorią czystego ES, aby wdrożyć ten projekt, zrobię to (nie tak, jakbym wcześniej nie musiał rezygnować z czystego projektu), ale wolałbym to zrobić ze względów wydajnościowych niż zacząć od złego projektu.
Aby uzyskać dodatkowy kredyt, pomyśl o tym samym projekcie, ale każda z „jednostek bossów” była faktycznie połączona z większą „jednostką BigBoss” złożoną z głównego korpusu, głównego rdzenia i 3 „podmiotów bossa”. Pozwoliłoby mi to znaleźć rozwiązanie dla co najmniej 3 wymiarów (dziadek-rodzic-dziecko) ... które powinno mi wystarczyć.