Per il mio attuale progetto ho implementato un sistema basato su componenti / entità , sostanzialmente seguendo la maggior parte delle migliori pratiche che esiste in questa area piuttosto indefinita .
Quindi ho ottenuto entità (leggermente estese) , che sono fondamentalmente un int
ID, un nome leggibile dall'uomo, una std::map
di componenti e un long
"indicatore di tipo" che viene utilizzato per mostrare quali componenti sono presenti (ho una potenza di due enum
per tutti i componenti tipi e ogni volta che un componente viene aggiunto all'entità, lo altero automaticamente tramite operazioni bit a bit, confrontando questa risposta ).
Poi ci sono i Componenti , anche piuttosto semplici: int
ID, enum
come tipo di componente, puntatore Entità padre e una std::map
di tutte le proprietà di questo componente.
Infine alcuni sistemi / gestori che gestiscono l'elaborazione logica effettiva. Prima controllano se l'Entità attualmente elaborata ha un long
"indicatore di tipo" corrispondente = sono presenti tutti i componenti necessari per quel sistema. Quindi accede ad alcune proprietà se necessario e chiama direttamente alcune funzioni nel rispettivo componente o invia alcuni messaggi (tramite un dispatcher di messaggi).
In conclusione: Fino a qui, un sistema basato su componenti / entità basato su eventi piuttosto standard combinato con un approccio basato sui dati (confronto, i componenti non hanno variabili di dati codificate, ma invece una mappa generica, come (alcuni) componenti / archetipi di componenti verranno successivamente letti dai file con l'opzione per aggiungere ulteriori dati, che non fa parte del codice componente effettivo.
Ora vorrei introdurre anche alberi del comportamento (basati su AiGameDev BTSK ) in quel progetto, ma non sono sicuro se e come debbano essere collegati ai componenti già esistenti o come integrare tali progetti in generale.
Vengono in mente diverse idee / punti / domande correlate:
I miei BT verranno letti dai file (di nuovo). Al momento non riesco a capire come farei meglio la connessione tra un
BT Action
albero e la codifica effettiva nella mia applicazione. Dovrei creare una sorta di mappa tra i nomi delle azioni utilizzati nei file BT e un puntatore a funzione per l'implementazione della logica effettiva? Qual è il solito approccio per risolverlo?Presumo che dovrò creare BT per tutti i miei diversi
Entity
tipi (quindi per ogni combinazione di componenti di logica di gioco / AI rilevante come indicato dal mio "indicatore di tipo" più volte citato). Di conseguenza non ha senso inserire leBT Action
implementazioni nei componenti, poiché molto probabilmente saranno coinvolti molti componenti per azione, vero?Quindi la
BT Action
logica dovrebbe trovarsi in un / più sistemi separati (ai cui metodi punta la mappa dall'idea n. 1)? Il sistema verificherebbe quindi, secondo il miolong
"indicatore di tipo", se ilEntity
BT per il quale è attualmente controllato e che gli è stato detto di eseguire una determinata azione (= metodo nel sistema) sia effettivamente autorizzato a farlo (= ha i componenti necessari). Ma in caso contrario (perché, ad esempio, il creatore di BT ha trascurato una situazione specifica, in cui un componente necessario potrebbe non essere più collegato all'entità in fase di esecuzione), non accadrebbe nulla.
Domande:
- Esistono concetti comprovati per quel tipo di integrazione?
- Qual è la tua opinione sui miei 3 punti sopra?
- Altre cose che mi vengono in mente, anche per quanto riguarda la progettazione basata su componenti / entità in generale?