Estoy codificando un juego espacial en C ++ para mi proyecto escolar. ¿Cómo puedo hacer que sea multijugador?

En términos más generales, el problema es uno de “simulación distribuida”. Incluso si fuera un simple juego de damas. El principal problema es sincronizar los estados del juego entre varias computadoras que funcionan a diferentes velocidades y con un retraso impredecible en el envío del estado del juego.

Con los juegos por turnos se vuelve mucho más simple. El problema del retraso se reduce a simplemente que todos los jugadores se reporten, ya que el tiempo es discreto.

Con los juegos “en tiempo real”, la situación no se reduce tan fácilmente, pero hay 3 modelos básicos, desde el más simple (y menos receptivo) hasta el más difícil (y más receptivo).

El primer modelo es completo del lado del servidor. Todos los clientes son clientes “tontos”, y simplemente transmiten las entradas del juego al servidor, y luego reciben el estado del juego del servidor y lo muestran al usuario. La mayoría de los juegos por turnos funcionan de esta manera, ya que nuevamente, la demora no es un factor en los juegos por turnos.

El segundo modelo son los clientes predictivos, con servidores de arbitraje. Básicamente, los clientes pueden actuar como motores de juego independientes y utilizar esa capacidad para predecir un poco más adelante, pero todos los clientes informan el estado del juego al servidor, y el servidor esencialmente “arbitra”, ejecutando su propia simulación y la del servidor. La decisión es final.

El tercer modelo es muy similar al segundo. Excepto que los clientes no transfieren el “estado” del juego. Al igual que el primer modelo, solo transfieren entradas del juego. Pero a diferencia del primer modelo, transfieren marcas de tiempo del juego junto con este estado. El servidor luego transmite todas estas entradas del juego según corresponda a los clientes afectados, pero esto es solo una línea de tiempo tentativa. (Y este es un paso opcional). Finalmente, el servidor esperará una corta duración, digamos una décima de segundo. La simulación final e irreversible del tiempo del juego correrá una décima de segundo detrás del tiempo real. Después de esa fecha límite, ignorará cualquier entrada de juego anterior a 1/10 de segundo (o cualquiera que sea el período). Ahora todos los clientes tienen su secuencia final de eventos del juego. El servidor recopiló todas las entradas como una cremallera de abrigo. La predicción del cliente del tiempo de juego “actual” ahora usa este “punto de control” de hace 1/10 de segundo en el tiempo de juego para predecir el estado actual del mundo del juego. Las entradas del juego se reenvían al servidor para ser recopiladas con las de otros clientes, mientras se juegan simultáneamente en los clientes (tentativamente). Y el proceso continúa en paralelo. Este modelo minimiza la sensación de “retraso”, pero como puede imaginar, es más complicado.

Es un poco un proyecto hacer un motor de juego multijugador realmente bueno, a menos que sea por turnos.

Supongo que quieres que sea simple.

Yo diría que cada cliente solo transmita el estado de solo las unidades bajo su control a todos los demás clientes.

El problema ocurre cuando dos entidades diferentes bajo el control de dos jugadores diferentes interactúan. Desea que el resultado sea el mismo para todos los clientes, aunque cada cliente vea el estado del otro cliente retrasado.

Ese es el enigma. Si utiliza las marcas de tiempo del juego y un servidor para resolverlo, puede hacerlo todo consistente.

Pero ese es el enigma con la simulación en tiempo real.

Si está basado en turnos, por otro lado, ese enigma desaparece y se vuelve trivial (a pesar de lo que te haga creer la civilización de Sid Meier).

EDITAR: piense en el problema de la simulación distribuida en tiempo real de esta manera: es un juego de peligro, excepto que los zumbadores están en lados opuestos del planeta, y el retraso es impredecible y, además, diferente dependiendo de dónde se encuentre.

Una dificultad que, como han dicho otros, probablemente esté más allá del alcance de su clase actual.

La programación de juegos es un tema complejo. Hay varios buenos libros de texto introductorios sobre cómo escribir juegos.

Aquí hay una búsqueda en Amazon para comenzar: Amazon.com: programación de juegos

Como con cualquier otra cosa en la programación, la ruta más simple es la reutilización de código: encuentre un marco que haga lo que quiera y aprenda a usarlo. Me llevó unos 5 segundos encontrar esto: un marco de juego de roles en línea multijugador para desarrollar juegos

Además de lo que dijo Daniel Super, podrías tener otro jugador local en la misma fuente (teclado). Eso es lo que hice hace 15 años para mi proyecto escolar, y esa era la norma para los juegos de PC hace unos 20 años, antes de que el juego LAN fuera generalmente compatible.

La forma más fácil sería agregar otro jugador local en la misma pantalla usando una segunda fuente de entrada.

El modo multijugador en red generalmente implica tener un servidor autorizado al que se puedan conectar varios clientes de juegos. Esto probablemente esté fuera del alcance de su clase C ++.

Como se indicó anteriormente, la forma más fácil es tener otro jugador local, pero recomendaría no usar el teclado para eso, sería mejor si usara gamepads porque cuando usa el teclado a veces uno de los jugadores no podrá para disparar / mover ya que hay muchas teclas presionadas, puede usar la biblioteca SDL para usar los gamepads, es bastante fácil, puede consultar Producciones de Lazy Foo para obtener algunos tutoriales geniales y fáciles.

More Interesting

Cambié el tipo de controlador de escritorio de mi laptop de MBR a GPT. ¿Afectaría eso la velocidad de mi computadora portátil?

Acabo de comenzar la universidad (ingeniería). ¿Cuál es la mejor computadora portátil (actualmente en el mercado o que vendrá pronto) para mí con RS 60000?

Estoy buscando una computadora portátil con Linux. ¿Cuál sugeriría dentro de un presupuesto en INR 25k?

Mi computadora portátil tiene 4 GB de RAM (menos se puede usar) y la reparación de la computadora me ha recomendado que actualice a 6 GB de RAM por $ 50 en su tienda, ¿recomendaría?

Cuando transfiera mi disco duro interno a otra PC, ¿estarán intactos mis datos personales?

Mi computadora portátil es genial, pero mi ventilador solo funciona, el uso de la CPU es de aproximadamente el 30%, la temperatura de la CPU es inferior al 30%.

Tengo un Dell Vostro ejecutándose en Ubuntu. Cada vez que enciendo la computadora portátil, el WiFi se apaga debido al interruptor inalámbrico. La pantalla de impresión funciona perfectamente, pero cuando pruebo la tecla del adaptador inalámbrico mientras presiono Fn no funciona. ¿Cómo puedo arreglar esto?

He estado usando Windows durante los últimos 10 años. ¿Debo cambiar a una Mac? ¿Vale la pena el cambio?

Quiero comprar una laptop ¿Cuáles son las mejores computadoras portátiles que son pequeñas (10 pulgadas) y menos de Rs 20,000?

Deseo comprar HP envy 15 x360 de los EE. UU. ¿Cuáles son sus pros y sus contras? ¿Hay algún problema en particular observado?

Tengo dos ranuras DDR3 en mi placa base. ¿Cuál es la mayor cantidad de ram que podría instalar? ¿Cuál es el tamaño más grande que puede tener un módulo DDR3?

He ahorrado $ 2000 para gastar en una computadora nueva. ¿Debería esperar y comprar el MacBook Pro 2016 cuando se lance o simplemente construir una nueva PC con Intel I7-6700?

Quiero comprar una computadora portátil que pueda manejar juegos pesados ​​como Assassin's Creed Unity o Rogue. Entonces, ¿cuál debo comprar?

Estoy planeando comprar una computadora portátil con un monitor 4k pero con una frecuencia de actualización de 48Hz. ¿Notaré que no es 60Hz mientras veo películas o cuando uso la PC? ¿Es esto un factor decisivo?

Tengo un portátil con un procesador Pentium quad core y 4 gb de ram, que es extremadamente lento. ¿Me ayudará si actualizo el RAM a 8 GB?