¿Qué implica crear un juego de plataformas multijugador en tiempo real?

13

Estoy creando un juego de plataformas que tiene una función "cooperativa" que me gustaría trabajar en redes / internet.

Ahora he leído sobre la programación de juegos en red, incluidos artículos como Lo que todo programador necesita saber sobre las redes de juegos y entiendo la diferencia entre técnicas como el bloqueo de punto a punto y las arquitecturas de predicción de servidor-cliente:

  • Llegué a la conclusión de que para cualquier juego en tiempo real que se juegue en Internet, el bloqueo entre pares simplemente no es una opción.
  • También me preocupa que incluso para un juego de plataformas, una arquitectura simple de cliente-servidor (sin algún tipo de predicción del cliente) resulte en un juego degradado debido a la demora entre la acción y la reacción causada por un viaje de ida y vuelta a un servidor. (Dicho esto, quiero eliminar la necesidad de un servidor central, por lo que solo uno de los jugadores, el cliente, experimentará este retraso).

Esto deja la predicción del cliente, pero incluso para un juego simple como un juego de plataformas esto todavía suena bastante complejo.

¿Cómo haría para crear un sistema predictivo de cliente que funcione para un juego de plataformas multijugador?

Justin
fuente
1
Una cosa de la que tendrá mucho menos de qué preocuparse en un juego cooperativo es hacer trampa;)
Jonathan Connell
Marqué esto como no constructivo. Las preguntas planteadas ("¿Cuánto trabajo es escribir un juego en red que cumpla la predicción del cliente? ¿Voy a terminar con la mitad de mi base de código que consiste en código de red?") Son demasiado amplias y no tienen ningún problema específico. La respuesta sería básicamente "depende", que no es una buena respuesta.
TravisG
-1, "Cuánto trabajo" es subjetivo.
Tetrad
1
La cantidad de trabajo no es subjetiva, ya que es independiente, pero depende de algunos factores (tamaño del juego, requisitos de precisión, etc.) que pueden afectar esos factores si es mucho trabajo, poco trabajo o algo intermedio (aunque qué tipo de trabajo es una mejor pregunta); Sin embargo, creo que el OP realmente pregunta cuánto esfuerzo se requiere y qué tan grande sería una parte de la base de código de este tipo de código. Tal como está redactado, puede ser demasiado amplio. Elegí una interpretación más estrecha y respondí eso. Creo que el OP debería esforzarse un poco más para reducir las preguntas a unos pocos puntos muy específicos.
Nate
@Tetrad Lo siento: intenté hacer que esta pregunta fuera lo más objetiva posible, pero mi pregunta se reduce a "¿es difícil crear un sistema predictivo de cliente que funcione para un juego de tipo Y"? Si no, aprenderé como yo ir, pero mi tiempo es limitado, así que aprender que es demasiado trabajo después de X días de juego es demasiado tarde. Trataría de proporcionar más detalles sobre Y, pero no quiero hacer la pregunta "demasiado localizada". El principal problema aquí es el movimiento, que es común a todos los juegos de plataformas (quiero que otros encuentren útil esta pregunta). Si puedo mejorar esta pregunta, agradeceré las sugerencias.
Justin

Respuestas:

5

No creo que la mitad de su base de código se convierta en código de red si decide implementar una característica como esta.

En mi opinión, la forma más sencilla de hacer esto es configurar un servidor "central" (incluso si eso significa que un jugador "aloja" el juego y luego se conecta a su propio servidor) que acepta todas las entradas del usuario lo más rápido posible , y lo envía de vuelta a cada cliente.

En el cliente, implementa esto de manera diferente que si estuviera haciendo un juego cooperativo para dos jugadores localmente, excepto que lee P1 desde el teclado y P2 desde la red.

Tendrá que hacer que el servidor envíe un estado de juego completo de vez en cuando, y ambos clientes pueden acceder al nuevo estado de autorización del servidor, o pueden pasar al nuevo estado (durante unos segundos). A menos que tenga una pérdida de paquetes horrible o toneladas de clientes por servidor, este enfoque debería ser suficiente para la situación que describe.

Nate
fuente
Lo cual es casi tan fácil como un enfoque de Servidor de Cliente (excepto que un cliente aloja el servidor -> no necesita un servidor dedicado pero tiene que ir con algo línea UDP + NAT Punchthrough que de todos modos necesita un servidor dedicado). En segundo lugar, propone el método de bloqueo (ya que está hablando de enviar estados de juego completos), este no es, en mi humilde opinión, el mejor método si el juego se ejecuta en Internet (aunque probablemente sea a través de LAN) donde el cliente-servidor es mucho más fácil para implementar.
Valmond
1
No, sugiero que envíe estados completos del juego ocasionalmente, para que el cliente pueda asegurarse de que no esté demasiado lejos.
Nate
2

Tengo un juego de estilo mMORPG completamente funcional con predicción del cliente (el juego está lejos de terminar pero funciona 'OK') y tengo algo a lo largo de 40,000 líneas de código para el servidor y el doble para el cliente (agregue la misma cantidad para herramientas, etc. .). La predicción probablemente no sea más de unos pocos cientos de líneas (si es que eso) y la red completa separa un par de miles de líneas, pero no más de 5.000 (depende un poco de dónde dibuje la línea).

Pregunta difusa respuesta difusa ;-)

Valmond
fuente
2

Una proporción significativa del código de red puede ser independiente del juego que estás jugando. Por eso, y porque eres nuevo en las redes, lo primero que te sugiero que hagas es encontrar bibliotecas que hagan ese trabajo por ti. RakNet por ejemplo.

Una cosa que querrás en tu código de juego es la capacidad de manejar múltiples estados de juego diferentes, que puedes usar para interpolación y predicción. Eso es bastante simple de diseñar desde el principio, pero puede ser una cantidad significativa de trabajo si está modificando un juego para un jugador existente.

También tenga en cuenta que si desea que extraños jueguen un juego de igual a igual a través de Internet, probablemente necesitará al menos un servidor en algún lugar que maneje el lobby / emparejamiento.

Adán
fuente