Colisiones entre jugadores en un juego de carreras multijugador

8

Estoy creando un juego de carreras simple (naves espaciales, sin gravedad) usando p2.js, phaser y node.js.

Lo que he hecho: el cliente recibe el estado mundial del servidor:

  • extrapolar a otros jugadores según la última velocidad / posición del servidor
  • compruebe si la predicción del lado del cliente fue correcta; si no, aplique la posición del servidor y procese las entradas de las que el servidor no era consciente.
  • paso fijo de física

Servidor:

  • recibe aportes de clientes y aplica
  • paso fijo de física
  • envía estado mundial a cada cliente

Ahora estoy luchando con colisiones entre jugadores. El jugador que colisiona salta todo el tiempo durante la colisión. Creo que es porque la predicción del lado del cliente no está calculando resultados similares al servidor.

El servidor no conoce todas las entradas del jugador (retraso).

El jugador no tiene la misma posición de jugador que colisiona que el servidor (retraso).

La combinación de estos dos hace que el cliente resuelva la colisión de manera diferente al servidor y, cuando llega el estado mundial, el jugador tiene que hacer una gran corrección.

Yozer
fuente
¿Sería posible aumentar el paso de tiempo en el servidor para que haya al menos menos corrección? ¿Has intentado hacer que los jugadores usen los mismos datos que tiene el servidor (la última posición enviada y la posición predictiva de los otros jugadores)?
user3797758
Sugerencia: ¿Ha intentado hacer que solo el servidor calcule la colisión? El cliente solo se usará para procesar y enviar / recibir datos (y reaccionar a los datos que recibió, por supuesto).
Greffin28
Posible duplicado del problema de compensación de latencia
lentos

Respuestas:

1

Hacer física solo en el servidor. Aquí hay un ejemplo de flujo de trabajo:

  1. El cliente presiona "dirigir hacia la izquierda".
  2. El cliente envía una solicitud de "dirección izquierda" al servidor
  3. El servidor recibe los datos.
  4. El servidor dirige la instancia del cliente en el servidor a la izquierda.
  5. El servidor detecta que hay una colisión entre jugadores.
  6. El servidor realiza correcciones en función de la colisión.
  7. El servidor envía datos de posición al cliente.
  8. El cliente recibe los datos del puesto.
  9. El cliente ajusta su posición.
S. Tarık Çetin
fuente
0

Si quieres que la interacción del jugador se sienta instantánea, entonces hay algunas opciones. Si no es así, solo haz física en el lado del servidor.

Opción 1 : el lado del cliente detecta la colisión y los datos de colisión se envían al servidor y / o directamente a otro cliente. Ciertos tiradores multijugador hacen este tipo de detección de colisión porque de lo contrario la mecánica de disparo no se sentiría precisa.

Opción 2 : El lado del servidor hace física, pero hace muchas predicciones diferentes. Puedes usar más instancias de cada jugador y predecir que harán cosas ligeramente diferentes. Asegúrese de que no colisionen y envíen los datos a los clientes. Cada vez que el movimiento del jugador coincide con una predicción, utiliza los datos que ya se han enviado al cliente.

Andreas
fuente