Sto iniziando il mio primo progetto di gioco "corretto" e ho inevitabilmente colpito un blocco cercando di decidere come comunicare i componenti di gioco in XNA.
Dai precedenti eventi di programmazione della GUI (Java), i gestori e gli ascoltatori sembravano la strada da percorrere. Quindi avrei una specie di bus per eventi che accetta le iscrizioni agli eventi e le classi iscritte a quegli eventi, con gestori che li gestiscono. Ad esempio (pseudocodice):
class SpriteManager
Update(){
if(player.collidesWith(enemy)
// create new 'PlayerCollisionEvent'
}
class HUDManager
onPlayerCollisionEvent(){
// Update the HUD (reduce lives etc)
}
Tuttavia, non sono sicuro dell'impostazione del codice (in C #) che sarebbe necessaria per ottenere questo risultato. Cosa tiene traccia degli eventi (una specie di autobus?) E come è strutturato?
Sui Servizi di gioco sembra anche essere molto menzionato, per cui puoi registrare un GameComponent nella tua classe Game.cs principale, quindi recuperarlo da qualsiasi parte del codice che abbia un riferimento all'oggetto principale "Game". L'ho provato con il mio oggetto SpriteBatch e sembra molto semplice .. tuttavia, non riesco a vedere che sia flessibile come un modello di eventi.
Prendi ad esempio quando un nemico muore. Vogliamo aggiornare il punteggio del gioco. Usando i servizi posso ottenere un riferimento al mio oggetto StateManager creato in Game1 e aggiunto come servizio, quindi impostare 'punteggio' sul nuovo valore. Pensavo che un evento "onEnemyDeath", che può essere gestito in modo diverso da una moltitudine di classi, ma avviato da 1 riga di codice nella relativa sezione "Rilevazione della morte nemica", sarebbe meglio che lanciare individualmente ogni GameComponent richiesto quindi chiamare qualunque sono richiesti metodi.
O queste strategie inferiori sono qualcos'altro?
Mi rendo conto che questa è in parte la mia scarsa conoscenza di C # tanto quanto i paradigmi di comunicazione del gioco, ma mi piacerebbe davvero che questa cosa fondamentale fosse corretta.
Aggiornare
Dopo aver esaminato i Servizi è più dettagliato, ne sono meno convinto: sostanzialmente passa una variabile globale (da quello che ho capito).
Aggiornamento 2
Dopo aver dato un'occhiata a questo tutorial di base sulla gestione degli eventi e testare il codice di esempio, sembra che gli eventi sarebbero una scelta logica per ciò di cui sto discutendo. Ma non posso usarlo molto nei campioni che ho visto. C'è qualche ovvio motivo per cui non si dovrebbe?