Sto creando un sistema di oggetti di gioco basato su componenti . Alcuni suggerimenti:
GameObjectè semplicemente un elenco diComponents.- Ci sono
GameSubsystems. Ad esempio, rendering, fisica ecc. OgnunoGameSubsystemcontiene puntatori ad alcuniComponents.GameSubsystemè un'astrazione molto potente e flessibile: rappresenta qualsiasi fetta (o aspetto) del mondo di gioco.
V'è la necessità di un meccanismo di registrazione Componentsa GameSubsystems(quando GameObjectè stato creato e composto). Esistono 4 approcci :
- 1: modello di catena di responsabilità . Ognuno
Componentè offerto a tuttiGameSubsystem.GameSubsystemprende una decisione su qualeComponentsregistrarsi (e su come organizzarli). Ad esempio, GameSubsystemRender può registrare componenti di rendering.
pro. Componentsnon sapere come vengono utilizzati. Accoppiamento basso. A. Possiamo aggiungere nuovi GameSubsystem. Ad esempio, aggiungiamo GameSubsystemTitles che registra tutti i ComponentTitle e garantisce che ogni titolo sia unico e fornisca l'interfaccia per eseguire query sugli oggetti per titolo. Naturalmente, ComponentTitle non deve essere riscritto o ereditato in questo caso. B. Possiamo riorganizzare esistenti GameSubsystems. Ad esempio, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter possono essere uniti in GameSubsystemSpatial (per posizionare tutto l'audio, l'emettitore, il rendering Componentsnella stessa gerarchia e utilizzare trasformazioni relative al genitore).
con. Ogni controllo. Molto inefficiente
con. Subsystemssapere Components.
- 2: Ciascuno
SubsystemcercaComponentstipi specifici.
pro. Prestazioni migliori rispetto a Approach 1.
con. Subsystemsancora sapere Components.
- 3: si
Componentregistra inGameSubsystem(s). Sappiamo al momento della compilazione che esiste un GameSubsystemRenderer, quindi ComponentImageRender chiamerà qualcosa come GameSubsystemRenderer :: register (ComponentRenderBase *).
pro. Prestazione. Nessun controllo non necessario come in Approach 1.
con. Componentssono accoppiati male con GameSubsystems.
- 4: modello mediatore .
GameState(che contieneGameSubsystems) può implementare registerComponent (Component *).
pro. Componentse GameSubystemsnon sanno nulla l'uno dell'altro.
con. In C ++ sembrerebbe brutto e lento switch-typeid.
Domande:
quale approccio è migliore e maggiormente utilizzato nella progettazione basata su componenti? Cosa dice la pratica? Qualche suggerimento sull'implementazione di Approach 4?
Grazie.
Componentsin GameObjectsè fuori della portata della mia domanda. Leggi articoli sull'approccio basato sui componenti o poni la tua domanda su questo sito se sei interessato. Quello che pensi GameSubsystemè totalmente sbagliato.