Por fim, comecei a brincar com o XNA e a brincar com um jogo em 2D (tenho vários recursos de arte de um amigo que o desenvolveu no iOS)
Muitas coisas parecem fáceis de fazer e saem da caixa, no entanto, fiquei perplexo por muitas coisas, já que a maioria da literatura (os livros que comprei por exemplo) não presta muita atenção ao 2D.
Eu realmente aprecio qualquer esclarecimento ou estou sendo direcionado para mais informações sobre as seguintes questões:
Qual é o objetivo de um serviço de jogos? Entendo todo o idioma de registrar um objeto como um serviço para que qualquer outro GameComponent possa obtê-lo, no entanto, como isso acontece simplesmente tornando-o público ou estático? Por exemplo, meu livro recomendou o registro do objeto SpriteBatch na classe Game.cs. Não sei como é preferível simplesmente torná-lo público / estático, pois deve haver apenas uma instância do jogo (singleton)?
Estou confuso sobre quando devo herdar de GameComponent ou RenderableGameComponent. Estou tentando seguir um design de gerente / controlador, de modo que todas as entidades sejam criadas / pertencentes a um único gerente e o mesmo para outras coisas. Atualmente, tenho cada gerente / controlador herdado do GameComponent, no entanto, como isso supera o fato de o objeto Game possuir todos os gerentes e chamar manualmente a atualização deles e desenhar?
Percebi que Initialize é chamado antes de ContentLoad (), achei isso irritante, pois no meu Initialize é onde eu gostaria de criar algumas das minhas entidades (por exemplo, Sprite, Player etc.), no entanto, não posso fornecer o carregamento delas. SpriteSheets ou Textures desde que a chamada para carregá-los ainda não ocorreu. Talvez eu esteja inicializando incorretamente ou as pessoas simplesmente atribuem a textura mais abaixo no ContentLoad?
Esses parecem ser o meu maior " WTF " de não entender realmente
fonte
SpriteBatch.Draw
é especificada nas coordenadas de pixel de textura em relação à parte superior esquerda da textura (ou retângulo de origem, se você usar uma).public
/static
propriedades. Por quê? Testabilidade. É quase impossível mudar as coisas com a abordagem de propriedades, enquanto que é trivial se tudo for inicializado com umIServiceProvider
que possa ser preenchido com qualquer coisa que a classe precise pelo seu método de teste. Também evita a necessidade de instanciar oGame
próprio objeto em seu teste, que fica confuso muito rapidamente.Game
objeto. Por acaso, eles são acessados por meio de interfaces empurradas para asGame.Services
quais são repassadas a tudo para obter o que precisam novamente.Para sua primeira pergunta, devo admitir que realmente não sei a resposta real. Eu acho que seria pelo mesmo motivo pelo qual singleton geralmente é um padrão de design ruim. Vou encaminhá-lo para uma citação neste link :
Para sua segunda pergunta, eu assumiria que usar Componentes como este seria mais útil se você seguisse uma abordagem baseada em componentes , como se tivesse uma lista de
Sprite
componentes que saberiam desenhar e atualizar a si mesmos em vez de um gerente que sabe atualizar e desenhar todos os sprites. Concordo, parece o mesmo, mas prefiro um design baseado em componentes porque realmente gosto da abordagem orientada a objetos que ele possui.Para sua terceira pergunta, sim, você deve carregar qualquer forma de conteúdo (ativos, fontes, etc.) no método LoadContent. Quanto à inicialização, você normalmente cria o objeto Player na função Initialize e carrega seu conteúdo no LoadContent. Ou pode fazer tudo isso no LoadContent, se desejar.
fonte