Myślę, że już wpadłem na pomysł Entity System zainspirowany przez Adama Martina (t-machine). Chcę zacząć używać tego do mojego następnego projektu.
Znam już podstawy Entity, Components i Systems. Mój problem dotyczy sposobu obsługi interfejsu użytkownika / interfejsu użytkownika. Na przykład okno zadania, okno umiejętności, okno informacji o postaci itp. Jak radzisz sobie ze zdarzeniami interfejsu użytkownika (np. Naciśnięcie przycisku)? Są to rzeczy, które nie muszą być przetwarzane w każdej klatce. Obecnie używam MVC do kodowania interfejsu użytkownika, ale nie sądzę, że będzie kompatybilny z Entity System.
Przeczytałem, że Entity System jest osadzony na większym OOP. Nie wiem, czy interfejs użytkownika znajduje się poza ES, czy nie. Jak podejść do tego?
źródło
Chociaż myślę, że interfejs Entity / Component może działać, trudno byłoby to zrobić. Ponadto jest wystarczająco daleko usunięty z komponentów i systemów, które miałbyś do przetwarzania bytów gry, w zasadzie byłby to po prostu inny byt / system składników w grze. Nie mogę sobie wyobrazić, że te dwa elementy będą się na siebie nakładały.
Systemy jednostek są niesamowite i używanie ich wszędzie może być kuszące. W końcu, kiedy dostajesz naprawdę słodki młotek, masz ochotę traktować wszystkie swoje problemy jak paznokcie. Jednak system EC jest tylko kolejnym narzędziem w twojej torbie do programowania. W przypadku problemów używanych do rozwiązania działa naprawdę dobrze, ale masz lepsze narzędzia do rozwiązywania problemów, takich jak interfejs użytkownika.
Struktura dziedziczenia działa bardzo dobrze w przypadku GUI. Nie tylko do tworzenia komponentów interfejsu użytkownika, ale także do ich rozmieszczania. Naprawdę miło jest mieć możliwość, aby komponenty interfejsu użytkownika były potomkami innych komponentów, aby mogły dziedziczyć właściwości takie jak pozycja, skala i krycie. Jeśli spróbujesz skonfigurować system EC, będziesz musiał złamać niektóre zasady systemu EC.
źródło
Możesz utworzyć nową funkcję interfejsu, która jest wywoływana przy każdym rysowaniu interfejsu użytkownika / interfejsu użytkownika i zezwalać komponentom niestandardowym / skryptowym na implementację tej funkcji. Wymaga to użycia systemu IMGUI (w Google jest wiele samouczków, jest to tylko oryginalna prezentacja). Dzięki temu możesz tworzyć okna jako elementy, w których będziesz mieć swój własny komponent budowania interfejsu użytkownika i komponent renderujący ramę okna.
Jeśli chodzi o nieprzetwarzanie tego wszystkiego w każdej ramce, możesz wyrenderować cały interfejs użytkownika w innym buforze, który będziesz aktualizować tylko dla wszelkiego rodzaju zdarzeń wejściowych / danych. Oznacza to, że za każdym razem, gdy odbierane jest zdarzenie, zmienia ono pewną zmienną, aby wskazać, że okno wymaga odmalowania następnej klatki. Jeśli ta zmienna jest prawdziwa, wówczas jest ustawiona na false, a następnie wywoływane są interfejsy interfejsu użytkownika. Jeśli potrzebujesz animacji, ważne jest, abyś używał tej dokładnej kolejności operacji, aby sam interfejs użytkownika mógł wywołać odmalowanie następnej klatki.
źródło