Dla tworzonej gry 2D (dla systemu Android) Używam systemu opartego na komponentach, w którym GameObject zawiera kilka obiektów GameComponent. GameComponents mogą być takie, jak komponenty wejściowe, komponenty renderowania, komponenty wypunktowania i tak dalej. Obecnie GameComponents ma odniesienie do obiektu, który je posiada i może go modyfikować, ale GameObject ma po prostu listę komponentów i nie obchodzi go, czym są komponenty, o ile można je aktualizować, gdy obiekt jest aktualizowany.Komunikacja w opartym na komponentach silniku gry
Czasami składnik ma pewne informacje, które GameObject musi znać. Na przykład, do wykrywania kolizji GameObject rejestruje się z podsystemem wykrywania kolizji, który ma być powiadamiany, gdy zderzy się z innym obiektem. Podsystem wykrywania kolizji musi znać ramkę ograniczającą obiektu. Przechowuję X i Y bezpośrednio w obiekcie (ponieważ jest używany przez kilka komponentów), ale szerokość i wysokość są znane tylko komponentowi renderowania, który przechowuje bitmapę obiektu. Chciałbym mieć metodę getBoundingBox lub getWidth w GameObject, która pobiera te informacje. Lub ogólnie, chcę wysłać pewne informacje z komponentu do obiektu. Jednak w moim obecnym projekcie GameObject nie wie, jakie konkretne elementy ma na liście.
mogę myśleć kilka sposobów na rozwiązanie tego problemu:
Zamiast całkowicie rodzajowy listę elementów, mogę pozwolić GameObject mają określonego pola dla niektórych ważnych elementów. Na przykład może mieć zmienną składową o nazwie renderingComponent; ilekroć potrzebuję uzyskać szerokość obiektu, używam tylko
renderingComponent.getWidth()
. To rozwiązanie wciąż pozwala na generowanie listy komponentów, ale traktuje niektóre z nich w inny sposób i obawiam się, że otrzymam kilka wyjątkowych pól, ponieważ trzeba będzie zapytać o więcej składników. Niektóre obiekty nie mają nawet składników renderujących.Mieć wymagane informacje jako członkowie GameObject, ale pozwolić komponentom na jego aktualizację. Zatem obiekt ma szerokość i wysokość, które domyślnie są równe 0 lub -1, ale komponent renderujący może ustawić je na prawidłowe wartości w swojej pętli aktualizacji. To wydaje się być hackerem i mogę w końcu pchnąć wiele rzeczy do klasy GameObject dla wygody, nawet jeśli nie wszystkie obiekty ich potrzebują.
Mieć komponenty zaimplementować interfejs, który wskazuje, jakiego rodzaju informacji mogą one dotyczyć. Na przykład komponent renderujący implementowałby interfejs HasSize, który zawiera metody takie jak getWidth i getHeight. Gdy GameObject potrzebuje szerokości, wykonuje pętle nad swoimi komponentami, sprawdzając, czy implementują interfejs HasSize (używając słowa kluczowego
instanceof
w Javie lubis
w języku C#). Wydaje się, że jest to bardziej ogólne rozwiązanie, jedną wadą jest to, że wyszukiwanie komponentu może zająć trochę czasu (ale wtedy większość obiektów ma tylko 3 lub 4 komponenty).
To pytanie nie dotyczy konkretnego problemu. Często pojawia się w moim projekcie i zastanawiałem się, jaki jest najlepszy sposób, aby sobie z tym poradzić. Wydajność jest nieco ważna, ponieważ jest to gra, ale liczba komponentów na obiekt jest z reguły mała (maksymalna to 8).
Wersja krótka
W systemie opartym na składniku do gry, co jest najlepszym sposobem przekazywania informacji z komponentów do obiektu przy zachowaniu konstrukcji generycznych?
W pewnym sensie oczekiwałem, że to będzie odpowiedź; że istnieje wiele podejść i wszystkie są wykonalne w różnych kontekstach. Masz rację co do całkowicie ogólnych systemów, byłem zbyt zaawansowany w inżynierii i martwiłem się o problemy, które nie istnieją. –