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.
Respuestas:
Hacer física solo en el servidor. Aquí hay un ejemplo de flujo de trabajo:
fuente
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.
fuente