J'ai du mal à comprendre comment gérer la gestion de l'État dans mes entités.
Je n'ai aucun problème avec la gestion de l'état du jeu, comme la pause et les menus, car ceux-ci ne sont pas traités comme un système de composants d'entité; juste avec l'état dans les entités / composants.
Comme dessin à partir d'Orcs Must Die, j'ai mes entités MainCharacter et Trap qui n'ont que leurs composants comme PositionComponent, RenderComponent, PhysicsComponent.
À chaque mise à jour, l'entité appellera la mise à jour de ses composants. J'ai également un EventManager générique avec des écouteurs pour différents types d'événements.
Maintenant, je dois pouvoir placer les pièges: sélectionnez d'abord le piège et la position du piège, puis placez le piège.
Lorsque vous placez un piège, il doit apparaître devant le personnage principal, rendu d'une manière différente et le suivre. Une fois placé, il devrait simplement répondre aux collisions et être rendu de la manière normale.
Comment cela est-il généralement géré dans les systèmes basés sur des composants?
(Cet exemple est spécifique mais peut aider à comprendre la manière générale de gérer les états des entités.)
la source
Réponses:
Une application intéressante d'un système de composants est que vous pouvez modifier les composants d'une entité au moment de l' exécution si vous l'avez conçu pour pouvoir gérer de tels composants . L'état d'une entité devient ainsi la somme des composants qui lui sont attribués et des valeurs qu'ils contiennent.
Pour votre exemple, vous pouvez d'abord créer le piège avec a
BuildControllerComponent
(régissant la réaction aux contrôles des joueurs en phase de construction), aPositionComponent
et aRenderComponent
. Le dernier a un champ de données qui régit le pixel shader (s) utilisé, et l'un d'eux donne au piège à construire un aspect "fantomatique". Vous remarquerez qu'aucun composant physique n'a encore été attribué.En plaçant le piège, les composants sont échangés. Le
BuildControllerComponent
n'est plus nécessaire, il est donc supprimé. LesRenderComponent
shaders sont remplacés par votre vue standard normale du piège. Enfin,PhysicsComponent
tout ce qui est nécessaire au fonctionnement du piège est ajouté à l'entité.Dans une approche basée sur l'héritage, cela équivaut à avoir un constructeur pour une
ActiveTrapEntity
classe qui prend uneBuildTimeTrapEntity
classe comme arguments, le second étant utilisé pour rendre le piège pendant sa construction, le premier étant utilisé pour le piège après qu'il soit en place .la source
BuildControllerComponent
t -elle ?" ou "Quelle est la position de cette entité telle qu’elle est enregistrée dans sonPositionComponent
cas, le cas échéant?" - ceux que vous faites en vérifiant la liste des composants pour ceux qui vous intéressent et en interrogeant éventuellement (certaines) leurs valeurs.BuildControllerComponent
s. Il doit déjà traiter les changements de point de vue du personnage du joueur (ou de la caméra) et les événements de touche et de souris.Je n'aime pas l'idée d'entités appelant des mises à jour sur leurs composants (les systèmes devraient faire le travail), et cela va conduire à des problèmes pour garder les composants ignorants les uns des autres.
Vous pouvez ajouter un composant supplémentaire appelé "État". Il sera accessible par vos systèmes de rendu et de collision. Le composant d'état n'est qu'un indicateur qui dispose de plusieurs états. Pour la situation que vous décrivez, les États seraient
Play
etBuild
. Lorsque le système de rendu constate que l'état est,Build
il dessine l'objet translucide. Lorsque le système de collision voit l'Build
état, il ne traite pas les collisions avec le joueur.Mais vraiment, si vous n'avez pas de système et que vous comptez sur des composants pour faire tout le travail, vous allez rencontrer beaucoup de problèmes. Les composants ne devraient pas se connaître et ne devraient pas faire de traitement.
la source
StateComponent
qui peut être consommé par plusieurs systèmes.