Di recente ho deciso di rinnovare la mia architettura di gioco per sbarazzarmi di gerarchie di classe profonde e sostituirle con componenti configurabili. La prima gerarchia che sto sostituendo è la gerarchia degli articoli e vorrei alcuni consigli per sapere se sono sulla buona strada.
In precedenza, avevo una gerarchia simile a questa:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
Inutile dire che stava iniziando a diventare disordinato e queste non erano una soluzione facile per gli oggetti che dovevano essere di più tipi (cioè alcune attrezzature vengono utilizzate nella sintesi degli oggetti, alcune sono gettabili, ecc.)
Ho quindi tentato di refactoring e posizionare funzionalità nella classe di articoli di base. Ma poi ho notato che l'articolo aveva molti dati inutilizzati / superflui. Ora sto provando a fare un componente come l'architettura, almeno per i miei oggetti prima di provare a farlo con le mie altre classi di gioco.
Ecco cosa sto pensando attualmente per l'installazione del componente:
Ho una classe di articoli di base che ha slot per vari componenti (ad es. Uno per componenti di equipaggiamento, uno per componenti di guarigione, ecc. Così come una mappa per componenti arbitrari) quindi qualcosa del genere:
class Item
{
//Basic item properties (name, ID, etc.) excluded
EquipmentComponent* equipmentComponent;
HealingComponent* healingComponent;
SynthesisComponent* synthesisComponent;
ThrowComponent* throwComponent;
boost::unordered_map<std::string, std::pair<bool, ItemComponent*> > AdditionalComponents;
}
Tutti i componenti dell'articolo erediterebbero da una classe ItemComponent di base e ogni tipo di componente è responsabile di dire al motore come implementare quella funzionalità. vale a dire, il HealingComponent dice ai meccanici di battaglia come consumare l'oggetto come un oggetto di guarigione, mentre il ThrowComponent dice al motore di battaglia come trattare l'oggetto come un oggetto da lanciare.
La mappa viene utilizzata per archiviare componenti arbitrari che non sono componenti di base. Lo sto associando a un bool per indicare se il contenitore degli articoli deve gestire ItemComponent o se è gestito da una fonte esterna.
La mia idea qui era quella di definire i componenti principali utilizzati dal mio motore di gioco in anticipo, e la mia fabbrica di oggetti avrebbe assegnato i componenti che l'oggetto effettivamente ha, altrimenti sarebbero nulli. La mappa conterrebbe componenti arbitrari che sarebbero generalmente aggiunti / consumati dai file di script.
La mia domanda è: è un buon design? In caso contrario, come può essere migliorato? Ho considerato il raggruppamento di tutti i componenti nella mappa, ma l'utilizzo dell'indicizzazione delle stringhe sembrava non necessario per i componenti degli elementi principali