Obecnie mam do czynienia z następującym problemem:
Usiłuję napisać klon ponga przy użyciu systemu komponentu jednostki (ECS). „Schemat” napisałem sam. Jest więc klasa, która zarządza bytami wszystkimi składnikami. Są też same klasy komponentów. Na koniec są moje systemy, które po prostu pobierają wszystkie byty, które mają komponenty, których potrzebuje system.
Na przykład mój system ruchu szuka wszystkich bytów, które mają komponent pozycji i komponent ruchu. Komponent pozycji po prostu utrzymuje pozycję, a komponent ruchu utrzymuje prędkość.
Ale rzeczywistym problemem jest mój system kolizji. Ta klasa jest jak logiczny obiekt blob. W tej klasie mam tak wiele specjalnych przypadków.
Na przykład: Moje wiosła mogą kolidować z granicami. Jeśli tak się stanie, ich prędkość zostanie ustawiona na zero. Moja piłka równie dobrze może zderzyć się z granicami. Ale w tym przypadku jego prędkość jest tylko odzwierciedlona na normalnej granicy, więc jest odzwierciedlona. Aby to zrobić, nadałem piłce dodatkowy element fizyki, który mówi tylko: „Hej, to się nie kończy, odbija się”. Tak więc element fizyki nie ma rzeczywistych danych. Jest to pusta klasa, która jest po to, aby poinformować system, czy obiekt odbija się, czy zatrzymuje.
Potem pojawia się następująca zasada: chcę wyrenderować cząsteczki, gdy piłka zderzy się z łopatkami lub brzegami. Sądzę więc, że kula musi uzyskać inny element, który każe systemowi kolizji stworzyć cząstkę podczas zderzenia.
Następnie chcę mieć ulepszenia, które mogą kolidować z wiosłami, ale nie z granicami. Jeśli tak się stanie, ulepszenia muszą zniknąć. Potrzebowałbym więc znacznie więcej przypadków i komponentów (aby powiedzieć systemowi, że niektóre byty mogą kolidować tylko z niektórymi innymi, bot nie ze wszystkimi, nawet jeśli inne faktycznie są w stanie zderzyć się, ponadto system kolizji musiał zastosować ulepszenia do wiosła itp. itd. itd.).
Widzę, że system komponentu encji jest dobry, ponieważ jest elastyczny i nie masz problemów z dziedziczeniem. Ale obecnie utknąłem całkowicie.
Czy myślę zbyt skomplikowany? Jak mam poradzić sobie z tym problemem?
Jasne, muszę stworzyć systemy, które faktycznie są odpowiedzialne za „postkolizję”, więc system kolizji mówi tylko „Tak, mamy kolizję w ostatniej ramce”, a potem jest kilka systemów „po kolizji”, które wszystkie wymagają różnych (kombinacji) komponentów, a następnie zmieniają komponenty. Na przykład istniałby ruch po zderzeniu, który zatrzymuje rzeczy, które muszą się zatrzymać, gdy dojdzie do kolizji. Następnie fizyka-system po zderzeniu, który odbija rzeczy itp.
Ale nie wydaje mi się to również właściwym rozwiązaniem, ponieważ na przykład:
- Mój ruch po kolizji wymagałby bytów, które mają komponent pozycji, komponent ruchu i komponent kolizji. Wtedy ustawiłoby prędkość bytu na zero.
- System fizyki postkolizyjnej wymagałby bytów, które mają komponent pozycji, komponent ruchu, komponent zderzenia i komponent fizyki. Wtedy odzwierciedlałby wektor prędkości.
Problem jest oczywisty: ruch po zderzeniu wymaga bytów, które są podzbiorem bytów w fizycznym systemie po zderzeniu. Tak więc dwa systemy po zderzeniu działałyby na tych samych danych, czego efektem jest: Chociaż istota ma element fizyczny, po zderzeniu prędkość byłaby zerowa.
Jak te problemy są ogólnie rozwiązywane w systemie komponentów bytu? Czy te problemy są w ogóle zwykłe, czy robię coś złego? Jeśli tak, co i jak należy to zrobić?