Tworzę system obiektowy oparty na komponentach . Kilka porad:
GameObjectjest po prostu listąComponents.- Istnieje
GameSubsystems. Na przykład renderowanie, fizyka itp. KażdyGameSubsystemzawiera wskaźniki do niektórychComponents.GameSubsystemjest bardzo potężną i elastyczną abstrakcją: reprezentuje dowolny fragment (lub aspekt) świata gry.
Potrzebny jest mechanizm rejestracji Componentsw GameSubsystems(kiedy GameObjectzostanie utworzony i skomponowany). Istnieją 4 podejścia :
- 1: Wzór łańcucha odpowiedzialności . Każdy
Componentjest oferowany każdemuGameSubsystem.GameSubsystempodejmuje decyzję, któraComponentsrejestracja (i jak je zorganizować). Na przykład GameSubsystemRender może zarejestrować Komponenty Renderowalne.
zawodowiec. Componentsnic 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 Componentsw tej samej hierarchii i korzystania z transformacji względem rodzica).
kon. Czek dla każdego. Bardzo inne.
kon. Subsystemswiedzieć o Components.
- 2: Każde
SubsystemwyszukujeComponentsokreślone typy.
zawodowiec. Lepsza wydajność niż w Approach 1.
kon. Subsystemswciąż wiem o Components.
- 3:
Componentrejestruje 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. Componentssą źle połączone z GameSubsystems.
- 4: Wzór mediatora .
GameState(który zawieraGameSubsystems) może implementować registerComponent (Component *).
zawodowiec. Componentsi GameSubystemsnic 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.
Componentssię GameObjectsjest 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, GameSubsystemjest całkowicie błędne.