É possível reutilizar a mesma janela em vários jogos?


7

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?


Provavelmente algo como uma implementação de sistema de cenas pode funcionar?
Gustavo Maciel

Eu acho que realmente depende se você tem acesso ao código para outros mini-jogos ou não. teoricamente deveria ser possível. pelo menos, tenho uma idéia de como fazer isso se os minijogos forem escritos em código C / C ++ puro.
#

@ Gajet Adicionei mais informações à minha pergunta. Não tenho acesso ao código dos mini-jogos. É uma ferramenta de criação de jogos rodando no XNA, e são os usuários da ferramenta que podem querer conectar seus próprios minijogos.
David Gouveia

Respostas:


6

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.)


Obrigado pela resposta. Comecei a escrever um comentário para a sua resposta, mas ele ficou muito grande, então eu o adicionei à minha pergunta. Qual a sua opinião sobre isso?
David Gouveia

@DavidGouveia Atualizado para responder ao seu acompanhamento.
Andrew Russell

Obrigado, acho que de alguma maneira consegui imaginar como implementar isso, e a resposta foi útil. Ainda assim, vou esperar alguns dias antes de aceitar, porque estou curioso para saber se alguém poderá inventar maneiras não-oficiais e insanas de fazê-lo funcionar sem nenhum sistema de plug-ins.
David Gouveia
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.