Eu tinha uma pergunta sobre arquitetura de jogos: Qual é a melhor maneira de fazer com que diferentes componentes se comuniquem?
Peço desculpas se essa pergunta já foi feita um milhão de vezes, mas não consigo encontrar nada com exatamente o tipo de informação que estou procurando.
Eu tenho tentado construir um jogo a partir do zero (C ++, se for o caso) e observei alguns softwares de jogos de código aberto como inspiração (Super Maryo Chronicles, OpenTTD e outros). Percebo que muitos desses designs de jogos usam instâncias globais e / ou singletons em todo o lugar (para coisas como filas de renderização, gerenciadores de entidades, gerenciadores de vídeo etc.). Estou tentando evitar instâncias globais e singletons e construindo um mecanismo o mais fracamente possível, mas estou encontrando alguns obstáculos que devem à minha inexperiência em um design eficaz. (Parte da motivação para este projeto é abordar isso :))
Eu criei um design no qual tenho um GameCore
objeto principal que possui membros análogos às instâncias globais que vejo em outros projetos (ou seja, ele possui um gerenciador de entrada, um gerenciador de vídeo, um GameStage
objeto que controla todas as entidades e o jogo para qualquer estágio atualmente carregado, etc). O problema é que, como tudo é centralizado no GameCore
objeto, não tenho uma maneira fácil de diferentes componentes se comunicarem.
Olhando para o Super Maryo Chronicles, por exemplo, sempre que um componente do jogo precisa se comunicar com outro componente (ou seja, um objeto inimigo quer se adicionar à fila de renderização a ser desenhada no estágio de renderização), ele apenas conversa com o instância global.
Para mim, preciso que meus objetos de jogo passem informações relevantes de volta ao GameCore
objeto, para que o GameCore
objeto possa passar essas informações para o (s) outro (s) componente (s) do sistema que precisa (por exemplo: para a situação acima, cada objeto inimigo passaria suas informações de renderização de volta para o GameStage
objeto, que coletaria tudo e passaria para GameCore
, o que por sua vez passaria para o gerenciador de vídeo para renderização). Parece um design realmente horrível, e eu estava tentando pensar em uma solução para isso. Meus pensamentos sobre possíveis projetos:
- Instâncias globais (design de Super Maryo Chronicles, OpenTTD, etc)
- Ter o
GameCore
objeto como intermediário através do qual todos os objetos se comunicam (design atual descrito acima) - Forneça ponteiros de componentes para todos os outros componentes com os quais eles precisarão conversar (por exemplo, no exemplo Maryo acima, a classe inimiga teria um ponteiro para o objeto de vídeo com o qual precisa conversar)
- Divida o jogo em subsistemas - Por exemplo, tenha objetos gerenciadores no
GameCore
objeto que manipulem a comunicação entre objetos em seu subsistema - (Outras opções? ....)
Imagino que a opção 4 acima seja a melhor solução, mas estou tendo alguns problemas para projetá-la ... talvez porque tenha pensado em termos dos projetos que vi que usam globais. Parece que estou pegando o mesmo problema existente no meu design atual e replicando-o em cada subsistema, apenas em uma escala menor. Por exemplo, o GameStage
objeto descrito acima é uma tentativa de fazer isso, mas o GameCore
objeto ainda está envolvido no processo.
Alguém pode oferecer algum conselho de design aqui?
Obrigado!