Hej zaczynam pisać gierke:
http://www.supertowerdefence.pl/Ogólnie to ma być tower defence ale chce na niego patrzeć trochę szerzej. Zacząłem się zastanawiać co potrzebują moje obiekty aby móc odtworzyć przynajmniej część funkcjonalności jakie są w grze Starcraft/Starcraft2.
Przykłady:
- Budynek produkuje "cos" ale są budynki co: latają, poruszają się, strzelają, mają kilka trybów itp.
- Jednostki: strzelaja, lub atakują w zwarciu, mogą mieć różne prędkości w zależności od tego czy latają czy poruszają się po ziemi (wodę też można dodać), produkują w sumie naboje (budynki np. jednostki)
- Pociski: Zadają obrażenia, poruszają się, mają zasięg
Ogólnie wychodzi na, że potencjalnie budynek i pocisk mogą posiadać wszystkie właściwości jednostki. Ale przecież tylko 1 na 20 budynków umie latać i się poruszać, 1 na 20 umie strzelać oraz są budynki, które nic nie produkują np. bunkier. Tak samo z jednostkami.
Zaciekawiło mnie podejście ECS ale nie znalazłem konkretnych przykładów jak to wygląda w praktyce.
Zakładam, że:
- Obiekt "Entity" ma id i liste "Components",
- Posiadam listę, w której mam wszystkie "Entity"
- Posiadam managery, które potrafią reagować na określony "Component" np. Manager ruchu porusza obiekty na podstawie komponentu ruchu (MoveManager i MoveComponent)
I tutaj zaczynam mieć pytania:
- Czy komponent ruchu powinien mieć pozycje X, Y ? Co wtedy z komponentem Pozycji ? A może jakoś powiązać te komponenty...
- Przeważnie jak pisałem jakiś projekt za poruszanie był odpowiedzialny moduł fizyki, który też obsługiwał kolizje i reakcje na nie.
- Zastanawia mnie też kod głównej pętli przeglądania Entity, czy wygląda to tak?:
Jeżeli Komponent ruchu to wywołaj manager ruchu,
Jeżeli Komponent fizyki to wywołaj manager fizyki,
Jeżeli Komponent strzelania to wywołaj manager strzelania.
A może to managery uruchamiają się w kolejności i przeszukują wszystkie obiekty i jak obiekt ma komponent, na którym pracuje dany manager to manager wywołuje na nim odpowiedni kod/funkcje? Jednak w tym założeniu widzę zagrożenie ze strony zmniejszenia wydajności - każdy nowy komponent to kolejna iteracja po elementach. Z drugiej strony można mieć sublisty dla tych komponentów, które są używane bardzo rzadko.
Ogólnie widzę trudność w podziale projektu na dobre komponenty, które nie będą się dublować i które będą od siebie niezależne.
Może ktoś pracował w tym podejściu i ma jakieś cenne rady ?
Może dla mojego problemu warto zainteresować się jeszcze jakim innym podejściem ? np. FRP?
Dobre materiały związane z grami typu RTS mile widziane.
Pozdrawiam,
Adam