Après avoir passé en revue quelques modèles de conception de jeu, je me suis installé avec Entity-Component-System (ES System) pour mon moteur de jeu. J'ai lu des articles (principalement T = Machine ), passé en revue un code source et je pense en avoir assez pour commencer.
Il y a juste une idée de base avec laquelle je me bats. Comment puis-je traiter avec des groupes d'entités qui dépendent les uns des autres?
Me laisser utiliser un exemple:
Supposons que je fabrique un jeu de tir aérien standard (pensez à Jamestown ) et que je souhaite construire une "entité de boss" avec plusieurs parties distinctes mais liées. La panne pourrait ressembler à quelque chose comme ça:
- Corps du navire: Mouvement, rendu
- Canon: position (verrouillé par rapport au corps du navire), poursuite \ tir au héros, prise de dégâts jusqu'à désactivation
- Noyau: position (verrouillé par rapport au corps du navire), suivi \ tir sur le héros, subit des dommages jusqu'à ce qu'il soit désactivé, désactivation (er ... destruction) de toutes les autres entités du groupe de navires
Mon objectif serait d’identifier (et de manipuler) un élément de jeu distinct sans avoir à réécrire le sous-système à la base à chaque fois que je souhaite construire un nouvel élément agrégat.
Comment implémenter ce type de conception dans ES System?
- Est-ce que je mets en place une sorte de relation d'entité parent-enfant (les entités peuvent avoir des enfants)? Cela semble aller à l’encontre de la méthodologie selon laquelle les entités ne sont que des conteneurs vides et donnent davantage d’impression à la POO.
- Est-ce que je les implémente en tant qu'entités distinctes, avec une sorte de composant de connexion (BossComponent) et de système associé (BossSubSystem)? Je ne peux pas m'empêcher de penser que cela sera difficile à mettre en œuvre, car la communication des composants semble être un piège à ours.
- Est-ce que je les implémente comme une seule entité, avec une collection de composants (ShipComponent, CannonComponents, CoreComponent)? Celui-ci semble changer de direction par rapport à l'intention du système ES (les composants ici ressemblent trop à des entités lourdes), mais je suis au courant de cela, j'ai donc pensé que je l'énoncerais.
- Est-ce que je les implémente comme quelque chose d'autre que j'ai mentionné?
Je sais que cela peut être mis en œuvre très facilement dans la programmation orientée objet, mais je choisirai de choisir ES plutôt que la programmation orientée objet. Si je dois rompre avec la théorie ES pure pour mettre en œuvre ce design, je le ferai (ce n’est pas comme si je n’avais jamais eu à compromettre le design pur auparavant), mais je préférerais le faire pour des raisons de performance plutôt que pour commencer par un mauvais design.
Pour obtenir un crédit supplémentaire, songez au même concept, mais chacune des "entités boss" était en fait connectée à une "entité BigBoss" plus grande composée d’un corps principal, d’un noyau principal et de 3 "entités Boss". Cela me permettrait de voir une solution pour au moins 3 dimensions (grand-parent-parent-enfant) ... ce qui devrait être plus que suffisant pour moi.