J'imagine que cette question ou les variations de celle-ci se passent beaucoup, donc si ce que je dis est un doublon, et les réponses se trouvent ailleurs, s'il vous plaît informez-moi. J'ai fait des recherches sur les conceptions de moteurs de jeu et j'ai découvert le modèle d'entité basé sur les composants. Cela semble prometteur, mais je travaille encore sur sa mise en œuvre.Gestion d'événements dans la conception de moteur de jeu basé sur des composants
Je considère un système où le moteur est organisé de plusieurs "sous-systèmes", qui gèrent certains aspects, comme le rendu, le son, la santé, AI, etc. Chaque sous-système a un type de composant associé, comme un composant pour le sous-système de santé. Une "entité", par exemple un PNJ, une porte, un effet visuel ou le joueur, est simplement composée d'un ou de plusieurs composants, qui, une fois réunis, confèrent à l'entité sa fonctionnalité. J'ai identifié quatre canaux principaux de transmission d'information: un composant peut diffuser vers tous les composants de son entité actuelle, un composant peut diffuser vers son sous-système, un sous-système peut diffuser vers ses composants et un sous-système peut diffuser vers d'autres sous-systèmes.
Par exemple, si l'utilisateur souhaitait déplacer ses caractères, il appuyait sur une touche. Cette pression sur la touche serait captée par le sous-système d'entrée, qui diffuserait alors l'événement et serait récupéré par le sous-système du joueur. Le sous-système du joueur envoie alors cet événement à tous les composants du joueur (et donc aux entités composant ces composants), et ces composants du joueur communiquent avec le composant de position de sa propre entité pour aller de l'avant et se déplacer.
Tout cela pour une touche presse semble un peu sinueux, et je suis certainement ouvert à des améliorations à cette architecture. Mais de toute façon, ma question principale suit toujours. En ce qui concerne les événements eux-mêmes, j'ai considéré où un événement se comporte comme dans le modèle de visiteur. L'importance de ce que je veux, c'est que si un événement rencontre un composant qu'il ne supporte pas (comme dans un événement de déplacement n'a rien à voir avec AI ou santé), il ignorerait le composant. Si un événement ne trouve pas le composant recherché, cela n'a pas d'importance.
Le modèle de visiteur fonctionne presque. Cependant, il faudrait que j'aie des fonctions virtuelles pour chaque type de composant (c'est-à-dire visitHealthComponent, visitPositionComponent, etc.) même si cela n'a rien à voir avec eux. Je pourrais laisser ces fonctions vides (donc si elles tombaient sur ces composants, elles seraient ignorées), mais je devrais ajouter une autre fonction chaque fois que j'ajoute un composant. Mes espoirs étaient que je serais capable d'ajouter un composant sans nécessairement ajouter des trucs à d'autres endroits, et ajouter un événement sans jouer avec d'autres choses.
Alors, mes deux questions:
- Y at-il des améliorations ma conception pourrait permettre, en termes d'efficacité, de flexibilité, etc.?
- Quelle serait la façon optimale de gérer les événements?