J'ai récemment décidé de réorganiser mon architecture de jeu pour se débarrasser des hiérarchies de classes profondes et les remplacer par des composants configurables. La première hiérarchie que je remplace est la hiérarchie des articles et j'aimerais avoir des conseils pour savoir si je suis sur la bonne voie.
Auparavant, j'avais une hiérarchie qui ressemblait à ceci:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
Inutile de dire que cela commençait à devenir désordonné et que ce n'était pas une solution facile aux objets qui devaient être de types multiples (c'est-à-dire que certains équipements sont utilisés dans la synthèse des objets, certains équipements sont jetables, etc.)
J'ai ensuite tenté de refactoriser et de placer des fonctionnalités dans la classe d'objet de base. Mais alors je notais que l'article avait beaucoup de données inutilisées / superflues. Maintenant, j'essaie de faire un composant comme l'architecture, au moins pour mes objets avant d'essayer de le faire pour mes autres classes de jeu.
Voici ce que je pense actuellement pour la configuration des composants:
J'ai une classe d'objet de base qui a des emplacements pour divers composants (c'est-à-dire un emplacement de composant d'équipement, un emplacement de composant de guérison, etc. ainsi qu'une carte pour des composants arbitraires) donc quelque chose comme ceci:
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;
}
Tous les composants d'élément hériteraient d'une classe ItemComponent de base, et chaque type de composant est chargé d'indiquer au moteur comment implémenter cette fonctionnalité. c'est-à-dire que le HealingComponent indique aux mécaniciens de bataille comment consommer l'objet en tant qu'objet de guérison, tandis que le ThrowComponent indique au moteur de combat comment traiter l'objet en tant qu'objet jetable.
La carte est utilisée pour stocker des composants arbitraires qui ne sont pas des composants d'élément de base. Je l'associe à un booléen pour indiquer si le conteneur d'articles doit gérer le composant d'élément ou s'il est géré par une source externe.
Mon idée ici était de définir les composants de base utilisés par mon moteur de jeu à l'avance, et ma fabrique d'articles assignerait les composants que l'élément a réellement, sinon ils sont nuls. La carte contiendrait des composants arbitraires qui seraient généralement ajoutés / consommés par les fichiers de script.
Ma question est, est-ce un bon design? Sinon, comment peut-il être amélioré? J'ai envisagé de regrouper tous les composants dans la carte, mais l'utilisation de l'indexation des chaînes semblait inutile pour les composants principaux de l'élément