Wyobrażam sobie, że to pytanie lub jego różne wersje są często przekazywane, więc jeśli to, co powiem, jest duplikatem, a odpowiedzi leżą gdzie indziej, proszę poinformuj mnie.Obsługa zdarzeń w komponentowym projekcie silnika gier
Badałem konstrukcje silników gier i natrafiłem na model jednostki opartej na komponentach. Brzmi obiecująco, ale wciąż pracuję nad jego wdrożeniem.
Rozważam system, w którym silnik jest zorganizowany z kilku "podsystemów", które zarządzają pewnym aspektem, jak renderowanie, dźwięk, zdrowie, sztuczna inteligencja itd. Każdy podsystem ma przypisany typ komponentu, taki jak zdrowie komponent dla podsystemu zdrowia. "Istota", na przykład NPC, drzwi, jakiś efekt wizualny lub gracz, składa się z jednego lub więcej elementów, które razem dają podmiotowi funkcjonalność.
Zidentyfikowaliśmy cztery główne kanały przekazywania informacji: komponent może nadawać do wszystkich komponentów w bieżącej encji, komponent może nadawać do swojego podsystemu, podsystem może nadawać do jego składników, a podsystem może nadawać do innych podsystemów.
Na przykład, jeśli użytkownik chciał przenieść swoje znaki, naciśnie klawisz. To naciśnięcie klawisza zostanie pobrane przez podsystem wejściowy, który następnie rozgłasza zdarzenie i zostanie odebrany przez podsystem gracza. Podsystem odtwarzacza wysyła to zdarzenie do wszystkich komponentów odtwarzacza (a więc do elementów, które komponenty tworzą), a te komponenty odtwarzacza będą komunikować się z komponentem pozycji własnej jednostki, aby kontynuować i przenieść.
Wszystko to dla kluczowej prasy wydaje się nieco kręte, i jestem z pewnością otwarta na ulepszenia tej architektury. Ale tak czy inaczej, moje główne pytanie jest nadal aktualne.
Co do samych wydarzeń, zastanawiałem się, gdzie wydarzenie zachowuje się tak, jak we wzorcu odwiedzającego. Znaczenie tego, czego chcę, to to, że jeśli zdarzenie napotka jakiś komponent, który nie obsługuje (jak w przypadku ruchu nie ma nic wspólnego z sztuczną inteligencją lub zdrowiem), zignoruje ten składnik. Jeśli zdarzenie nie znajdzie komponentu, do którego dąży, nie ma to znaczenia.
Wzór gościa prawie działa. Wymagałoby to jednak posiadania funkcji wirtualnych dla każdego typu komponentu (np. VisitHealthComponent, visitPositionComponent, itp.), Nawet jeśli nie ma z nimi nic wspólnego. Mógłbym pozostawić te funkcje puste (więc jeśli natrafiłoby się na te komponenty, byłoby to zignorowane), ale musiałbym dodać kolejną funkcję za każdym razem, gdy dodaję komponent.
Miałem nadzieję, że będę mógł dodać komponent, niekoniecznie dodając rzeczy do innych miejsc i dodać wydarzenie bez naruszania innych rzeczy.
Więc moje dwa pytania:
- czy są jakieś ulepszenia mój projekt może umożliwić, pod względem wydajności, elastyczności itp?
- Jaki byłby optymalny sposób obsługi zdarzeń?