Estou começando no meu primeiro projeto de jogo 'adequado' e, inevitavelmente, atingi um quarteirão tentando decidir como os componentes do jogo no XNA devem se comunicar.
Em eventos de programação GUI (Java) anteriores, manipuladores e ouvintes pareciam o caminho a seguir. Então, eu teria algum tipo de barramento de evento que aceita registros e classes de eventos inscritos nesses eventos, com manipuladores para lidar com eles. Por exemplo (pseudocódigo):
class SpriteManager
Update(){
if(player.collidesWith(enemy)
// create new 'PlayerCollisionEvent'
}
class HUDManager
onPlayerCollisionEvent(){
// Update the HUD (reduce lives etc)
}
No entanto, não tenho certeza da configuração do código (em C #) necessária para fazer isso completamente. O que mantém o controle de eventos (algum tipo de ônibus?) E como está estruturado?
Também parece haver muita coisa mencionada no Game Services, na qual você pode registrar um GameComponent na classe Game.cs principal e buscá-lo em qualquer lugar do código que tenha uma referência ao objeto 'Game' principal. Eu tentei isso com meu objeto SpriteBatch e parece muito fácil .. no entanto, não vejo isso tão flexível quanto um modelo de evento.
Tomemos, por exemplo, quando um inimigo morre. Queremos atualizar a pontuação do jogo. Usando serviços, posso obter uma referência ao meu objeto StateManager criado no Game1 e adicionado como um serviço, depois definir 'score' para o novo valor. Eu pensaria que um evento 'onEnemyDeath', que pode ser tratado de maneira diferente por várias classes, mas iniciado por 1 linha de código na seção 'detecção de morte inimiga' relevante, seria melhor do que lançar individualmente cada GameComponent necessário e depois chamar o que quer métodos são necessários.
Ou essas estratégias são inferiores a outra coisa?
Sei que esse é parcialmente o meu pobre conhecimento em C #, tanto quanto os paradigmas de comunicação de jogos, mas eu realmente gostaria de acertar essa coisa fundamental.
Atualizar
Observar os Serviços é mais detalhes, estou menos convencido - basicamente está passando uma variável global (pelo que entendi).
Atualização 2
Tendo examinado este tutorial básico sobre manipulação de eventos e teste do código de amostra, parece que os eventos seriam uma escolha lógica para o que estou discutindo. Mas não posso usá-lo muito nas amostras que já vi. Existe alguma razão óbvia para que alguém não deva?