Estoy empezando mi primer proyecto de juego 'adecuado', e inevitablemente he llegado a un bloque tratando de decidir cómo deben comunicarse los componentes del juego en XNA.
De los eventos de programación de GUI (Java) anteriores, los controladores y los oyentes parecían el camino a seguir. Por lo tanto, tendría algún tipo de bus de eventos que acepte registros de eventos y clases suscritas a esos eventos, con controladores para tratar con ellos. Por ejemplo (pseudocódigo):
class SpriteManager
Update(){
if(player.collidesWith(enemy)
// create new 'PlayerCollisionEvent'
}
class HUDManager
onPlayerCollisionEvent(){
// Update the HUD (reduce lives etc)
}
Sin embargo, no estoy seguro de la configuración del código (en C #) que se requeriría para lograr esto completamente. ¿Qué hace un seguimiento de los eventos (algún tipo de autobús?) Y cómo está estructurado?
También parece que se menciona mucho en Game Services, por lo que puede registrar un GameComponent en su clase principal de Game.cs, luego buscarlo en cualquier parte de su código que tenga una referencia al objeto principal 'Juego'. He intentado esto con mi objeto SpriteBatch y parece muy fácil ... sin embargo, no puedo ver que sea tan flexible como un modelo de evento.
Tomemos, por ejemplo, cuando un enemigo muere. Queremos actualizar la puntuación del juego. Al usar los servicios, puedo obtener una referencia a mi objeto StateManager creado en el Juego 1 y agregado como un servicio, luego establezco 'puntaje' al nuevo valor. Pensé que un evento 'onEnemyDeath', que puede ser manejado de manera diferente por una multitud de clases, pero iniciado por 1 línea de código en la sección relevante 'detección de muerte enemiga', sería mejor que lanzar individualmente cada GameComponent requerido y luego llamar a lo que sea Se requieren métodos.
¿O son estas estrategias inferiores a algo más?
Me doy cuenta de que esto es en parte mi pobre conocimiento de C # tanto como los paradigmas de comunicación del juego, pero realmente me gustaría entender bien esto.
Actualizar
Habiendo visto los Servicios es más detalle, estoy menos convencido: básicamente está pasando una variable global (por lo que entiendo).
Actualización 2
Después de echar un vistazo a este tutorial básico sobre el manejo de eventos y probar el código de muestra, parece que los eventos serían una elección lógica para lo que estoy discutiendo. Pero no puedo usarlo mucho en las muestras que he visto. ¿Hay alguna razón obvia por la que uno no debería?