Eu sou bastante novo no desenvolvimento de jogos (mas não na programação) e estou tentando descobrir qual seria a melhor maneira de lidar com a comunicação entre os mundos. O que eu quero dizer é o seguinte:
Eu tenho lido sobre sistemas de componentes de entidades (ECS) e como as pessoas sugerem o uso de mundos / espaços diferentes ( http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091 ) para uma subseção de um jogo. Por exemplo, um HUD, inventário ou combate / movimento têm um mundo / espaço separado (porque eles têm gráficos diferentes e lógica subjacente).
No entanto, eu queria saber como o inventário, ou o HUD, sabe sobre a saúde de um jogador quando a saúde é tratada por um espaço / mundo diferente, por exemplo, quando em combate?
Isso também se aplica à progressão do jogo em geral, por exemplo, diálogo com o NPC (um diálogo seria um espaço separado, pois é uma tela pop-up), mas como você transmitiria as escolhas feitas (ou no estado) do diálogo para outros espaços / mundos . Ou basicamente qualquer outro tipo de evento que influencie a progressão do jogo em diferentes espaços / mundos (saúde, mana, missões, diálogo, combate, inventário, hud, etc.)
Como alguém lidaria com esse tipo de design? Precisa de um objeto singleton (em implementação) que contenha todo esse tipo de informação? Isso seria estranho, porque, então, a components
necessidade de transmitir cada alteração a esse objeto singleton, que parece fazer as coisas duas vezes (indo contra o principal DRY da programação) ...
Estou meio que perdida aqui em termos de design, alguma dica?
---EDITAR---
Então, eu li alguns outros posts sugeridos por comentários e tive uma idéia geral sobre as possibilidades, no entanto, cada um deles parece ter uma grande desvantagem que os torna simplesmente não corretos. É muito possível que eu esteja supervisionando os detalhes que resolveriam essas desvantagens, então fique à vontade para me corrigir. Vou tentar dar uma visão geral, bem como algumas respostas para algumas perguntas.
Estou vendo três opções principais para 'compartilhar' dados entre espaços. Embora a maioria das postagens seja sobre o compartilhamento de dados entre sistemas, sinto que o mesmo pode ser aplicado ao compartilhamento de dados entre sistemas.
1. Consulta
Exemplo : Se o mundo do HUD precisar conhecer a saúde atual do jogador, ele poderá consultar outro mundo e solicitar a saúde atual.
Desvantagem : os mundos precisam saber um do outro, o que é um grande problema de dependência e vai contra a dissociação.
2: Mensagens diretas (sincronização e assíncrona)
Exemplo : se durante o combate a saúde de um jogador mudar, ele poderá enviar mensagens (sincronizadas e assíncronas, o que for necessário) para outros mundos que precisem saber sobre essa alteração.
Desvantagem : Ainda é a questão da dissociação: os mundos precisam saber um do outro.
3: Mensagens indiretas (sincronização e assíncrona) <- melhor opção
Exemplo : se durante o combate a saúde de um jogador mudar, ele poderá enviar mensagens (sincronização e assíncrona, o que for necessário) para o hub geral de mensagens. Outros mundos / sistemas que precisam saber sobre essa alteração são inscritos no canal de mensagens específico e lêem as mensagens.
De cabeça para baixo : completamente desacoplado, facilmente gerenciável e extensível.
Desvantagem / incerto : quando o canal de mensagens sabe que as mensagens precisam ser excluídas? Ou talvez o sistema que está inscrito marque (apenas para si) a mensagem como lida e aguarde novas mensagens -> messagebox se torne enorme depois de um tempo. Como os mundos / sistemas lidam com a ordem? Por exemplo, durante um quadro: se o HUD já pesquisou a mensagem de integridade e depois disso a saúde muda, o próximo quadro é atualizado. Para alguns aplicativos, esse pode não ser o caminho certo.
P: Um único objeto de jogo pode existir em vários espaços
Estou usando a estrutura Artemis ECS, que vem com espaços internos (chamados mundos). Cada entidade (e com ela, os dados na forma de componentes) é criada em um mundo e, portanto, não pode ser compartilhada entre mundos.