Système d'entité / composant et «entités» d'interface utilisateur

14

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)

cendres999
la source
3
Je pense que cela vous semble logique uniquement parce que vous créez un jeu en 2D. Imaginez que vous fassiez du jeu 3D (avec 2d gui) presque aucune logique de rendu ne pourrait être réutilisée, et les composants 2d gui dans le monde 3d n'auraient pas beaucoup de sens. Vous devez créer une interface graphique au-dessus du système de composants. Comme si votre GameplayScreen créait un monde d'entités avec des composants, et l'un des composants serait une caméra avec un "canevas" sur lequel votre rendu dessinerait. Et cette toile deviendra l'arrière-plan de cet écran.
Kikaimaru
1
@Kikaimaru, vous avez un point sur la 2D. Peut-être que je suis trop dans MVC, mais cela ressemble à un mélange de "modèle" (entités de jeu) et de vue / contrôleur (composants d'interface utilisateur). Cela fonctionne, bien sûr, mais est-ce ainsi que cela devrait fonctionner? Y a-t-il de meilleures façons? Comment font les autres?
ashes999
@ ashes999 votre commentaire et votre question initiale viennent du plus profond de mon cœur :)
Narek
@Armen Je n'ai jamais obtenu de réponse satisfaisante à cela.
ashes999
@ ashes999 moi à. Partout, les gens disent qu'il ne faut pas mélanger MVC avec ECS, mais pourquoi? Ce ne serait pas bien? Arme différente pour différentes tâches, n'êtes-vous pas d'accord?
Narek

Réponses:

4

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.

cendres999
la source
Où placez-vous la logique des éléments d'interface utilisateur avancés? C'est à dire. une barre de santé qui a besoin de savoir quand le joueur est touché et combien de diminuer la barre. Je ne peux pas réaliser s'il a besoin d'un système spécifique, ou d'un script ou autre chose ...
Emir Lima
@EmirLima pour quelque chose comme ça, je mettrais la plupart de la logique de l'interface utilisateur dans la barre de santé (modification de la taille de la barre de santé), et ferais que le joueur génère un événement quand il est touché, indiquant quelle est la valeur de santé nouvelle / modifiée. (La barre de santé peut capturer cet événement et réagir de manière appropriée.)
ashes999
Mais quel est l'objet barre de santé dans cette architecture? Est-ce une entité avec un composant "barre de santé"? Une classe qui hérite d'Entity? Un objet normal avec des appels de mise à jour codés en dur?
Emir Lima
1
@EmirLima Je modéliserais la barre de santé comme une entité et le joueur comme une entité. Vous pouvez faire tout ce qui vous semble logique.
ashes999
1

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, renderet gui. 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.

MichaelHouse
la source
Le son que je possède est assez différent de celui que vous avez décrit. J'ai des classes d'entité comme celles TouchButtonqui 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.
ashes999