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. OgnunoGameSubsystem
contiene 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 Components
a GameSubsystems
(quando GameObject
è stato creato e composto). Esistono 4 approcci :
- 1: modello di catena di responsabilità . Ognuno
Component
è offerto a tuttiGameSubsystem
.GameSubsystem
prende una decisione su qualeComponents
registrarsi (e su come organizzarli). Ad esempio, GameSubsystemRender può registrare componenti di rendering.
pro. Components
non 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 Components
nella stessa gerarchia e utilizzare trasformazioni relative al genitore).
con. Ogni controllo. Molto inefficiente
con. Subsystems
sapere Components
.
- 2: Ciascuno
Subsystem
cercaComponents
tipi specifici.
pro. Prestazioni migliori rispetto a Approach 1
.
con. Subsystems
ancora sapere Components
.
- 3: si
Component
registra 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. Components
sono accoppiati male con GameSubsystems
.
- 4: modello mediatore .
GameState
(che contieneGameSubsystems
) può implementare registerComponent (Component *).
pro. Components
e GameSubystems
non 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.
Components
in 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.