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.
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.