Je suis toujours vert aux systèmes d'entités / composants. Je trouve que, comme j'ai des composants utiles pour dessiner des sprites (ou des feuilles de sprites) et gérer les entrées (souris / clics tactiles), je veux naturellement les réutiliser pour créer des composants d'interface utilisateur (comme des boutons, par exemple un écran de sélection de niveau).
Cela me semble très étrange. J'ai toujours compris les entités comme des «modèles de jeu» comme des joueurs, des ennemis, des power-ups, etc. D'un autre côté, du point de vue de la réutilisation de code, la réutilisation de composants pour l'interface utilisateur est parfaitement logique.
Comment (et où) les préoccupations d'interface utilisateur / interface graphique s'intègrent-elles dans un système d'entité / de composant?
(Remarque: cette question est indépendante de la plate-forme car elle s'applique à plusieurs plates-formes / langues)
la source
Réponses:
Après avoir utilisé plusieurs systèmes de composants d'entité, en particulier CraftyJS, j'ai plus ou moins obtenu la réponse à ma question: oui, vous pouvez réutiliser des composants (en particulier des sprites ou des images et des gestionnaires de clic de souris dans les jeux 2D) pour l'interface graphique.
La plupart du temps, vous n'avez accès qu'à l'ECS, et non aux systèmes sous-jacents (par exemple, le système de dessin). Dans ce cas, vous pouvez utiliser des composants, car vous n'avez pas d'autre choix.
Si vous avez accès au système sous-jacent (par exemple, Ruby roguelike avec un accès direct aux Curses), vous pouvez trouver que dessiner / rendre directement sur ce système est plus efficace (moins de code, moins fragile, plus naturel) que d'utiliser un tas de entités et composants.
la source
En 2D ou 3D, un système de composants d'entité (ECS) devrait au moins avoir accès au système GUI, s'il ne fait pas partie du même ECS.
Personnellement, je ne mélangerais pas les deux. La réutilisabilité du code pour une interface graphique ne se produit vraiment qu'au niveau supérieur. Répondre à la souris / au clavier, au rendu, etc. Les fonctions prises par les différents boutons ou les informations affichées par certaines listes ne sont pas suffisamment génériques pour être réutilisées.
Par exemple, j'imagine que les composants pour les entités GUI seraient quelque chose comme
position
,render
etgui
. Où le composant GUI définirait le type d'action que l'entité GUI prend. Cependant, cette action va être assez unique et spécifique au contexte. Il en résulte que le système qui gère les composants de l'interface graphique est très grand et essentiellement conçu pour gérer chacune des fonctions de l'interface graphique (charger le jeu, enregistrer le jeu, trouver le serveur, etc.). Cela semble désordonné.Je préfère faire un fichier de classe standard pour chaque "écran" de l'interface graphique. Avoir toutes les fonctionnalités de cet écran en un seul endroit (avec des références à une classe de fonctionnalités commune). C'est beaucoup plus propre et plus facile à gérer.
Cependant, comme je l'ai dit, l'ECS devrait avoir accès au système GUI. Il doit être en mesure de fournir des informations à l'interface graphique en fonction des entités de ses systèmes. Par exemple, survoler une unité alliée fera apparaître une fenêtre GUI avec toutes les informations sur cette unité. Lorsque survoler une unité ennemie ouvrirait une fenêtre GUI avec des informations limitées. Vous ne voulez probablement pas programmer l'interface graphique pour connaître la différence entre les deux, vous voulez demander à l'entité d'afficher ses informations.
Ainsi, les entités auront probablement une sorte de composant GUI, mais ce seront des entités "en jeu", pas des entités GUI. Ce composant utilisera le système GUI externe pour créer son interface GUI.
la source
TouchButton
qui sont composées d'une feuille de sprites et d'un écouteur tactile. Pour le popup d'unité, je l'implémenterais probablement comme une combinaison de composant sprite + composant d'écoute de souris. Hmm.