J'avais une question sur l'architecture du jeu: quelle est la meilleure façon de faire communiquer les différents composants entre eux?
Je m'excuse vraiment si cette question a déjà été posée un million de fois, mais je ne trouve rien avec exactement le type d'informations que je recherche.
J'ai essayé de créer un jeu à partir de zéro (C ++ si cela importe) et j'ai observé certains logiciels de jeu open source pour l'inspiration (Super Maryo Chronicles, OpenTTD et autres). Je remarque que beaucoup de ces conceptions de jeux utilisent des instances globales et / ou des singletons partout (pour des choses comme les files d'attente de rendu, les gestionnaires d'entités, les gestionnaires vidéo, etc.). J'essaie d'éviter les instances globales et les singletons et de construire un moteur aussi peu couplé que possible, mais je rencontre certains obstacles dus à mon inexpérience dans la conception efficace. (Une partie de la motivation de ce projet est de résoudre ce problème :))
J'ai construit un design où j'ai un GameCore
objet principal qui a des membres qui sont analogues aux instances globales que je vois dans d'autres projets (c'est-à-dire qu'il a un gestionnaire d'entrée, un gestionnaire vidéo, un GameStage
objet qui contrôle toutes les entités et le jeu) quelle que soit l'étape actuellement chargée, etc.). Le problème est que, puisque tout est centralisé dans l' GameCore
objet, je n'ai pas de moyen facile pour différents composants de communiquer entre eux.
En regardant Super Maryo Chronicles, par exemple, chaque fois qu'un composant du jeu doit communiquer avec un autre composant (c'est-à-dire qu'un objet ennemi veut s'ajouter à la file d'attente de rendu à dessiner dans la phase de rendu), il parle simplement au instance globale.
Pour moi, je dois demander à mes objets de jeu de transmettre les informations pertinentes à l' GameCore
objet, afin que l' GameCore
objet puisse transmettre ces informations aux autres composants du système qui en ont besoin (par exemple: pour la situation ci-dessus, chaque objet ennemi transmettraient leurs informations de rendu à l' GameStage
objet, qui les collecterait toutes et les retransmettrait GameCore
, qui à leur tour les transmettraient au gestionnaire vidéo pour le rendu). Cela ressemble à un design vraiment horrible tel quel, et j'essayais de penser à une résolution. Mes réflexions sur les designs possibles:
- Instances globales (conception de Super Maryo Chronicles, OpenTTD, etc.)
- Faire en sorte que l'
GameCore
objet agisse comme un intermédiaire par lequel tous les objets communiquent (conception actuelle décrite ci-dessus) - Donnez des pointeurs de composants à tous les autres composants avec lesquels ils devront parler (c.-à-d., Dans l'exemple Maryo ci-dessus, la classe ennemie aurait un pointeur sur l'objet vidéo avec lequel elle doit parler)
- Diviser le jeu en sous-systèmes - Par exemple, avoir des objets de gestionnaire dans l'
GameCore
objet qui gèrent la communication entre les objets de leur sous-système - (Autres options? ....)
J'imagine que l'option 4 ci-dessus est la meilleure solution, mais j'ai du mal à la concevoir ... peut-être parce que j'ai pensé en termes de conceptions que j'ai vues utiliser des globales. J'ai l'impression de prendre le même problème qui existe dans ma conception actuelle et de le reproduire dans chaque sous-système, juste à une échelle plus petite. Par exemple, l' GameStage
objet décrit ci-dessus est en quelque sorte une tentative, mais l' GameCore
objet est toujours impliqué dans le processus.
Quelqu'un peut-il offrir des conseils de conception ici?
Merci!