Tworzę system obiektowy oparty na komponentach . Kilka porad:
GameObject
jest po prostu listąComponents
.- Istnieje
GameSubsystems
. Na przykład renderowanie, fizyka itp. KażdyGameSubsystem
zawiera wskaźniki do niektórychComponents
.GameSubsystem
jest bardzo potężną i elastyczną abstrakcją: reprezentuje dowolny fragment (lub aspekt) świata gry.
Potrzebny jest mechanizm rejestracji Components
w GameSubsystems
(kiedy GameObject
zostanie utworzony i skomponowany). Istnieją 4 podejścia :
- 1: Wzór łańcucha odpowiedzialności . Każdy
Component
jest oferowany każdemuGameSubsystem
.GameSubsystem
podejmuje decyzję, któraComponents
rejestracja (i jak je zorganizować). Na przykład GameSubsystemRender może zarejestrować Komponenty Renderowalne.
zawodowiec. Components
nic nie wiem o tym, jak są używane. Niskie sprzęgło. A. Możemy dodać nowy GameSubsystem
. Na przykład dodajmy GameSubsystemTitles, który rejestruje wszystkie ComponentTitle i gwarantuje, że każdy tytuł jest unikalny i zapewnia interfejs do wyszukiwania obiektów według tytułu. Oczywiście w tym przypadku ComponentTitle nie powinien być przepisywany ani dziedziczony. B. Możemy zreorganizować istniejące GameSubsystems
. Na przykład GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter można połączyć w GameSubsystemSpatial (w celu umieszczenia całego dźwięku, emitera, renderowania Components
w tej samej hierarchii i korzystania z transformacji względem rodzica).
kon. Czek dla każdego. Bardzo inne.
kon. Subsystems
wiedzieć o Components
.
- 2: Każde
Subsystem
wyszukujeComponents
określone typy.
zawodowiec. Lepsza wydajność niż w Approach 1
.
kon. Subsystems
wciąż wiem o Components
.
- 3:
Component
rejestruje się wGameSubsystem(s)
. W czasie kompilacji wiemy, że istnieje GameSubsystemRenderer, więc ComponentImageRender wywoła coś takiego jak GameSubsystemRenderer :: register (ComponentRenderBase *).
zawodowiec. Występ. Brak niepotrzebnych kontroli jak w Approach 1
.
kon. Components
są źle połączone z GameSubsystems
.
- 4: Wzór mediatora .
GameState
(który zawieraGameSubsystems
) może implementować registerComponent (Component *).
zawodowiec. Components
i GameSubystems
nic o sobie nie wiemy.
kon. W C ++ wyglądałoby to jak brzydki i wolny przełącznik typu.
Pytania:
Które podejście jest lepsze i najczęściej stosowane w projektowaniu opartym na komponentach? Co mówi praktyka? Wszelkie sugestie dotyczące wdrożenia Approach 4
?
Dziękuję Ci.
źródło
Components
sięGameObjects
jest poza zakresem mojego pytania. Przeczytaj artykuły na temat podejścia opartego na komponentach lub zadaj własne pytanie na tej stronie, jeśli jesteś zainteresowany. To, o czym myślisz,GameSubsystem
jest całkowicie błędne.Odpowiedzi:
Numer drzwi 3 ... Składnik rejestruje się w systemie GameSubsystem
Komponent jest na miejscu, aby utrzymać połączenie wyodrębnione z samego GameObject. Jakoś gdzieś coś faktycznie musi wchodzić w interakcje z podsystemami i taki jest komponent i jego cel.
W tym przypadku sprzężenie wcale nie jest złe.
Wydajność jest zasadniczo wymagana w tym przypadku, jeśli spodziewasz się jakiejkolwiek złożoności w swoim systemie, po prostu nie stać Cię na inne style wyszukiwania.
Wreszcie, jeśli jeden podsystem musi reagować na inny (renderer, fizyka, audio muszą wszystko robić, gdy coś się dzieje), komponenty mogą to ułatwić sobie nawzajem poprzez obiekt gry i utrzymywać ten szczególny rodzaj sprzężenia między systemami w zarządzaniu poprzez składniki.
źródło