Proyecto multijugador de Client Server

He revisado las muestras relevantes de WinForms / XNA aquí y aquí .

Sin embargo, mis requisitos son ligeramente diferentes.

Dado lo siguiente:

  • Estoy desarrollando un juego multijugador (Cliente – Servidor)
  • Habrá tres proyectos en la solución, uno para Cliente y Servidor respectivamente, más uno adicional que contiene el núcleo del juego / motor
  • Las instancias compartirán código común de este proyecto de motor (funcionalidad principal de Game Engine)
  • Requiero que la instancia del server también permita la administración del server (por ejemplo, list de conexiones, etc.) a través de un formulario de Windows
  • Finalmente, y lo que es más importante, propongo utilizar el patrón de Inyección de dependencies en la initialization de las instancias de cliente / server para inyectar la class de gestión de networking relevante según sea necesario, similar al enfoque aquí.

¿Cuál es la mejor manera de lograr esto? Específicamente, ¿hay algún error al organizar los proyectos en la solución de la manera que he propuesto anteriormente? Para el proyecto Servidor, ¿lo inicio como un proyecto XNA y luego llamo al Winform, o viceversa?

Gracias por cualquier consejo que pueda tener.

Editar: un breve ejemplo del patrón de estilo de "dependency injection" que planeo usar. ¡Perdóname si esto no es un ejemplo de DI "pura" / completa / tradicional!

// Create the server using (var game = new ExampleGame(new ServerNetworkManager())) { game.Run(); } // Create the client using (var game = new ExampleGame(new ClientNetworkManager())) { game.Run(); } 

OK, entonces después de la recepción positiva de mi idea de layout, he avanzado e implementado un prototipo. Para completar, describiré la estructura de mi proyecto a continuación. Lo más importante es que se construye y funciona, y el DI funciona muy bien.

Estructura de la solución (en VS2010)

  • Raíz de la solución:
    • Cliente . Aplicación de console. Proyecto de inicio.
    • Servidor Aplicación de console. Proyecto de inicio.
    • XNAGame Proyecto Windows XNA. No hay punto de input (Program.cs eliminado). Tipo de salida: Biblioteca de classs. Sin object de inicio.
    • Contenido del juego XNA . Proyecto de contenido XNA estándar.

Proyectos cliente / server
Haga reference al proyecto XNAGame y al espacio de nombres Microsoft.Xna. Ambos contienen un Program.cs con un método static void main() como se esperaba. Este método invoca el juego XNA, teniendo en count Dependency Injection, de la siguiente manera:

 // Network Manager type injected as appropriate. using (XNAGame game = new XNAGame(new ClientNetworkManager())) { game.Run(); } 

Proyecto XNAGame
Contiene toda la estructura de XNA habitual (class con methods de actualización / dibujo, etc.) pero con una diferencia fundamental: hay un formulario de Windows en este proyecto.

Las características de RTTI en C # permiten que esta instancia de class determine si se ha instanciado como Cliente o Servidor. Obviamente, las classs relevantes de Network Manager deberían haberse creado para implementar una interfaz común para que funcione el polymorphism. Por ejemplo:

 // Constructor accepts the "injected" type as below. public XnaGame(INetworkManager networkManager) { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; this.networkManager = networkManager; } // RTTI / Polymorphism. Determine if this instance is a Server or a Client. public bool IsServer() { return this.networkManager is ServerNetworkManager ? true : false; } // The Windows form within this project can then be run as follows. protected override void Initialize() { // TODO: Add your initialization logic here // If this is the server, we need to create and show the management form. if (this.IsServer() == true) { Form = new MainServerForm(); Form.Show(); } base.Initialize(); }