Implementación multijugador, ¿puedo implementarlo más tarde si lo deseo?

15

Planeo usar XNA para construir un proyecto de juego. No estoy completamente seguro en este momento si quiero agregar la funcionalidad multijugador o no, teniendo en cuenta que tengo muchos otros problemas para resolver en los que todavía soy nuevo. No quiero que el proyecto se salga necesariamente de control.

Mi pregunta es, si me dirijo a mi proyecto sin un plan para agregar soporte multijugador, ¿es fácil retroceder (generalmente no es así) y agregar el código necesario para capturar un juego multijugador?

Bryan Harrington
fuente

Respuestas:

24

Aquí hay un buen consejo tomado del manual de la biblioteca de redes de Zoidcom :

Si su proyecto está en la etapa de planificación, se recomienda diseñar el proyecto para la creación de redes desde el principio. La fijación del código de red en un estado tardío del proyecto probablemente conducirá a una refactorización masiva o una gran cantidad de piratería, lo que resultará en un código difícil de mantener y corregido por errores.

La forma más limpia es implementar todo el juego como si fuera un juego de red puro. Es decir, implemente el código para un servidor dedicado e implemente este código por ser solo código de servidor. Implemente el código del cliente del juego de manera similar. El servidor y el cliente pueden ejecutarse en el mismo proceso y ni siquiera necesitan usar un socket de red real, pero deben ser entidades separadas y todo el código debe estar diseñado para funcionar de esa manera. Cuando el jugador salta, no modifique el vector de salto del jugador directamente, sino que envíe un paquete de "tecla de salto presionada" al servidor y deje que el servidor se encargue de eso.

Esto significa que incluso en un juego de un solo jugador, hay un servidor invisible ejecutándose en segundo plano. Una versión multijugador del mismo juego solo necesita conectarse a un servidor remoto en lugar del local y listo, multijugador hecho. Las ventajas de esto son:

sin código separado para un jugador y multijugador, el código de red se prueba y desarrolla durante todo el código de limpieza del proyecto

Los proyectos que usan este esquema son casi todos juegos que usan cualquiera de los motores Quake, Civilization 4, Neverwinter Nights y muchos más.

Para conectar cliente y servidor en el mismo proceso con latencia cero, se pueden usar sockets locales. Estos son proporcionados por Zoidcom y pasan paquetes directamente de un ZCom_Control a otro, sin pasar por un socket de nivel de sistema operativo.

Leftium
fuente
Parece que esta es una configuración para la autoridad del servidor puro que odio. Si su ping al servidor es bajo, funciona bien. Pero cuando el ping es demasiado alto, las acciones en su pantalla se retrasan. Prefiero el método que utiliza el motor de origen, el cliente ejecuta la física y las cosas localmente y cualquier acción aparece de inmediato, pero el servidor aún lo verifica para asegurarse de que las personas no estén pirateando, y si hay alguna inconsistencia en lo que debería haber sucedido. , el servidor envía el estado correcto al reproductor y anula la simulación de clientes con nuevos datos.
AttackingHobo
8
@AttackingHobo: solo estás describiendo la predicción del cliente. Puede tener la predicción del cliente y la autoridad del servidor juntas bien, y no excluye la arquitectura descrita en el manual de Zoidcom.
@AttackingHobo @Joe: Y Zoidcom en realidad admite la predicción del lado del cliente ^^
Leftium
2

Estoy de acuerdo con el consejo citado en la respuesta de Leftium; diseñarlo para redes desde el principio, porque no podrá agregarlo más tarde .

La primera vez que intenté hacer un juego multijugador (¡ni siquiera estaba tratando de hacer un juego para un solo jugador!), Pensé que primero haría que el juego funcionara y luego agregaría redes. Mala idea. Me quedó un prototipo de un juego para un jugador realmente aburrido y no tengo idea de cómo transformarlo en un juego multijugador. Lo descarté por completo y comencé de nuevo, esta vez escribiendo código de red multijugador desde el principio. Todo pinchado.

Estoy seguro de que no es imposible comenzar con un juego de un jugador y agregar funcionalidad multijugador. Si lo piensa bien, planifíquelo correctamente y asegúrese de conocer su estrategia y luego, pruébelo. Creo que al menos sería un rompecabezas interesante para resolver. Pero realmente asegúrese de conocer su plan sobre cómo va a agregar redes.

Creo que hay un término medio (aunque nunca lo he intentado). Podrías escribir algunas clases falsas para funciones de red / multijugador, y ser diligente en usarlas mientras escribes el juego para un jugador. Luego, más tarde, si decides implementar el modo multijugador, solo completa las clases ficticias y estarás listo. Esto se acerca mucho al método servidor / cliente, pero es posible que pueda salirse con menos trabajo; después de todo, un juego para un solo jugador es más fácil de hacer que un juego multijugador, así que si vas a escribir tu juego para un jugador como un juego multijugador, ¿por qué no simplemente hacerlo multijugador?

Ricket
fuente