Comment coder UI / HUD dans Entity System?

18

Je pense que j'ai déjà eu l'idée du Entity System inspiré par Adam Martin (t-machine). Je veux commencer à l'utiliser pour mon prochain projet.

Je connais déjà les bases de l'entité, des composants et des systèmes. Mon problème est de savoir comment gérer l'interface utilisateur / HUD. Par exemple, une fenêtre de quête, une fenêtre de compétence, une fenêtre d'informations sur les personnages, etc. Comment gérez-vous les événements de l'interface utilisateur (par exemple en appuyant sur un bouton)? Ce sont des choses qui n'ont pas besoin d'être traitées à chaque image. Actuellement, j'utilise MVC pour coder l'interface utilisateur, mais je ne pense pas que ce sera compatible pour Entity System.

J'ai lu qu'Entity System est intégré à un POO plus grand. Je ne sais pas si l'interface utilisateur est en dehors d'ES ou non. Comment aborder celui-ci?

Sylpheed
la source

Réponses:

17

Vous pensez peut-être trop aux systèmes d'entités. Les entités sont destinées à définir des objets dans le jeu, tels que des personnages, des ennemis, des scripts, des balles, des déclencheurs, etc.

Peut-être que si vous séparez votre interface utilisateur, ce sera beaucoup mieux et plus facile. Vous n'avez pas à tout faire à l'intérieur de la portée des entités.

Gustavo Maciel
la source
C'est aussi ce que dit Adam Martin dans l'un de ses articles ou commentaires sur t-machine. L'ES est une solution à un problème spécifique. Il peut et doit être utilisé avec des solutions plus «traditionnelles» pour d'autres aspects du jeu (moteur).
user8363
Je vous remercie. Je ne sais tout simplement pas ce qui devrait être dans ES. Alors, comment codez-vous une interface utilisateur efficace? Je pense que MVC ne le coupe pas parce que j'ai des problèmes avec la hiérarchie.
Sylpheed
Je vois que vous acceptez d'utiliser une architecture différente pour l'interface utilisateur. Alors quel est le problème avec MVC?
Narek
@Armen MVC n'a aucun problème, mais le mettre dans la portée des entités l'a. C'est juste que ses avantages ne dépasseront pas ses inconvénients. Pas besoin d'être un astronaute d'architecture
Gustavo Maciel
3

Bien que je pense qu'une interface utilisateur d'entité / composant pourrait fonctionner, il serait difficile de le faire. De plus, il est suffisamment éloigné des composants et des systèmes que vous auriez pour traiter vos entités de jeu, il s'agirait essentiellement d'un autre système d' entités / composants dans votre jeu. Je ne peux pas imaginer qu'il y aurait beaucoup de chevauchement entre les deux.

Les systèmes d'entités sont impressionnants et il peut être tentant de les utiliser partout. Après tout, lorsque vous obtenez un marteau vraiment doux, vous êtes tenté de traiter tous vos problèmes comme des ongles. Cependant, le système EC n'est qu'un autre outil dans votre sac de programmation. Pour les problèmes qu'il est utilisé pour résoudre, cela fonctionne très bien, mais vous disposez de meilleurs outils pour des problèmes comme l'interface utilisateur.

La structure d'héritage fonctionne très bien pour les interfaces graphiques. Non seulement pour créer les composants de l'interface utilisateur, mais aussi pour les disposer. C'est vraiment agréable de pouvoir faire en sorte que les composants de l'interface utilisateur soient des enfants d'autres composants afin qu'ils puissent hériter de propriétés telles que la position, l'échelle et l'opacité. Si vous essayez de mettre cela en place avec un système EC, vous devrez enfreindre certaines règles du système EC.

MichaelHouse
la source
1

Vous pouvez créer une nouvelle fonction d'interface qui est appelée chaque fois que l'interface utilisateur / HUD est dessinée et autoriser les composants personnalisés / scriptés à implémenter cette fonction. Cela nécessite un système IMGUI (il y a beaucoup de tutoriels sur Google, c'est juste la présentation originale) pour être utilisé. Avec cela, vous pouvez créer des fenêtres en tant qu'entités à l'intérieur desquelles vous aurez votre propre composant de construction d'interface utilisateur et un composant de rendu de cadre de fenêtre.

Quant à ne pas traiter tout cela à chaque image, vous pouvez rendre toute l'interface utilisateur dans un tampon différent que vous ne mettrez à jour que sur toutes sortes d'événements d'entrée / de données. Autrement dit, chaque fois qu'un événement est reçu, il change une variable pour indiquer que la fenêtre doit être repeinte la trame suivante. Si cette variable est vraie, elle est alors définie sur false et les interfaces UI sont appelées après cela. Si vous voulez des animations, il est important que vous utilisiez cet ordre exact des opérations afin que l'interface utilisateur elle-même puisse déclencher une repeinture pour la prochaine image.

snake5
la source