Em particular, estou pensando em C # e XNA, e obviamente no Windows. Digamos que eu tenho o jogo principal, que é um jogo XNA normal, mas em algum momento eu gostaria de mudar momentaneamente para um mini-jogo que também foi implementado no XNA, mas é completamente independente do meu jogo.
Existe alguma maneira de alternar entre os dois jogos e reutilizar o mesmo identificador do Windows? E, de preferência, mantendo o estado antigo na memória, embora eu também pudesse implementar essa persistência gravando em um arquivo.
E, voltando ao jogo inicial, existe alguma maneira de acessar o valor retornado pelo método principal do minijogo? Por exemplo, 1 ou 0, dependendo se o jogador limpou o minijogo ou não.
Andrew Russell escreveu:
Você deve criar seu mini-jogo e seu jogo principal em classes separadas dentro do mesmo programa. Cada uma dessas classes deve ter os métodos Update, Draw, Initialize, etc. Você deve então ter algum tipo de controlador mestre para chamar esses métodos para ter apenas um jogo ativo por vez (isso também pode estar na sua classe principal).
Obrigado pela resposta. Sua sugestão é o que eu faria em uma situação normal de jogo - aquela em que eu criaria todos os mini-jogos e seu conteúdo.
Mas este não é um jogo, mas uma ferramenta de criação de jogos para criar aventuras gráficas, e é o usuário final que pode sentir a necessidade de conectar minijogos externos em resposta a determinados eventos do jogo.
O mecanismo interno mais antigo que estou tentando substituir foi feito no Flash e resolveu esse problema simplesmente carregando um SWF dentro do SWF principal. Funcionou bem na maioria dos casos. Estou tentando fazer algo semelhante, mas com o XNA agora.
Mas, seguindo seu treinamento ou pensamento, talvez eu possa criar um assembly separado contendo uma classe base ou interface comum para todos os minijogos e compilá-lo como uma DLL. Em seguida, o usuário faria referência a essa biblioteca, implementaria a interface e compilaria em sua própria biblioteca, que poderia ser carregada pelo mecanismo em tempo de execução e executada como um estado separado dentro do jogo principal. Estou perdendo algumas implicações ocultas?
Respostas:
Não.Não Não há uma maneira oficial de fazer isso na API.
Se você fosse louco , poderia talvez usar a reflexão para acessar os objetos DirectX subjacentes e, em seguida, induzi-los a reutilizar uma janela e acionar uma recarga de conteúdo no momento certo. (Apenas um contexto de dispositivo pode ser anexado a uma janela por vez, basicamente)
Você poderia deixá-los ter janelas separadas. Embora isso possa introduzir problemas, principalmente se ambos precisarem ser de tela cheia.
Você deve criar seu mini-jogo e seu jogo principal em classes separadas dentro do mesmo programa. Cada uma dessas classes deve ter os métodos Update, Draw, Initialize, etc. Você deve então ter algum tipo de controlador mestre para chamar esses métodos para ter apenas um jogo ativo por vez (isso também pode estar na sua classe principal).
Você pode usar gerenciadores de conteúdo separados para cada jogo / minijogo, permitindo descarregar o conteúdo de cada um deles quando terminar.
Considere analisar a amostra Game State Management .
Para responder sua edição:
Sim. Um tipo de sistema de plugins como esse deve funcionar bem.
Esteja ciente de que, uma vez carregado em um processo, você não poderá descarregar a DLL do plug-in sem descarregar todo o processo - embora seja possível descarregar seus recursos da maneira usual. (Observe para qualquer outra pessoa que se depare com isso: você pode descarregar ao usar AppDomains, mas estou razoavelmente certo de que isso não funcionará bem com o XNA.)
fonte