Je suis tout à fait nouveau dans le développement de jeux (mais pas dans la programmation) et j'essaie de comprendre quelle serait la meilleure façon de gérer la communication inter-mondiale. Je veux dire ceci:
J'ai lu sur les systèmes de composants d'entité (ECS) et comment les gens suggèrent d'utiliser différents mondes / espaces ( http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091 ) pour une sous-partie d'un jeu. Par exemple, un HUD, un inventaire ou un combat / mouvement obtiennent chacun un monde / espace séparé (car ils ont des graphiques différents et une logique sous-jacente.
Cependant, je me demandais comment l'inventaire ou le HUD connaît la santé d'un joueur lorsque la santé est gérée par un espace / monde différent, par exemple en combat?
Cela s'applique également à la progression du jeu en général, par exemple le dialogue avec le PNJ (un dialogue serait un espace séparé car il s'agit d'un écran contextuel), mais comment transmettriez-vous les choix effectués dans (ou l'état) du dialogue à d'autres espaces / mondes . Ou fondamentalement tout autre type d'événement qui influence la progression du jeu dans différents espaces / mondes (santé, mana, quêtes, dialogue, combat, inventaire, hud, etc.)
Comment gérer ce type de design? A-t-il besoin d'un objet singleton (dans l'implémentation) qui contient tout ce type d'informations? Ce serait bizarre car alors la components
nécessité de transmettre chaque changement à cet objet singleton qui donne envie de faire les choses deux fois (aller à l'encontre du DRY principal de la programmation) ...
Je suis un peu perdu ici en termes de design, des conseils?
---ÉDITER---
J'ai donc lu quelques autres articles suggérés par des commentaires et j'ai eu une idée générale des possibilités, mais chacun d'entre eux semble avoir un inconvénient majeur qui ne les rend pas corrects. Il est très possible que je supervise des détails qui pourraient résoudre ces inconvénients, alors n'hésitez pas à me corriger. Je vais essayer de donner un aperçu ainsi que des réponses à certaines questions.
Je vois trois options principales pour «partager» les données entre les espaces. Même si la plupart des articles concernent le partage de données entre systèmes, j'ai l'impression que la même chose peut être appliquée au partage de données entre systèmes.
1. Interrogation
Exemple : Si le monde HUD a besoin de connaître la santé actuelle du joueur, il peut interroger un autre monde et demander la santé actuelle.
Inconvénient : les mondes doivent se connaître, ce qui est un problème de dépendance majeur et va à l'encontre du découplage.
2: Messagerie directe (synchronisation et async)
Exemple : si pendant le combat la santé d'un joueur change, il peut envoyer des messages (synchronisation et async, tout ce qui est nécessaire) à d'autres mondes qui ont besoin de connaître ce changement.
Inconvénient : toujours le problème du découplage: les mondes doivent se connaître.
3: Messagerie indirecte (synchronisation et async) <- meilleure option
Exemple : si pendant le combat la santé d'un joueur change, il peut envoyer des messages (synchronisation et async, tout ce qui est nécessaire) au hub de messages général. D'autres mondes / systèmes qui ont besoin de connaître ce changement sont abonnés au canal de message particulier et lisent les messages.
Côté supérieur : complètement découplé, facilement gérable et extensible.
Inconvénient / peu clair : quand le canal de message sait-il que les messages doivent être supprimés? Ou peut-être que le système auquel vous êtes abonné marque (uniquement pour lui-même) le message comme lu et attend de nouveaux messages -> messagebox devient énorme après un certain temps. Comment les mondes / systèmes gèrent-ils l'ordre? Par exemple, pendant une trame: si le HUD a déjà interrogé le message de santé et après que la santé change, la prochaine trame du HUD est mise à jour. Pour certaines applications, ce n'est peut-être pas la bonne façon.
Q: Un seul objet de jeu peut exister dans plusieurs espaces
J'utilise le framework Artemis ECS qui est livré avec des espaces intégrés (appelés mondes). Chaque entité (et avec elle, les données sous forme de composants) est créée sur un monde et ne peut donc pas être partagée entre des mondes.