Actualmente en mi juego, el cliente no es más que un renderizador. Cuando se cambia el estado de entrada, el cliente envía un paquete al servidor y mueve al jugador como si estuviera procesando la entrada, pero el servidor tiene la última palabra sobre la posición.
Esto generalmente funciona muy bien, excepto por un gran problema: caerse de los bordes. Básicamente, si un jugador camina hacia un borde, digamos un acantilado, y se detiene justo antes de salir del borde, a veces un segundo después, será teletransportado fuera del borde. Esto se debe a que el paquete "Dejé de presionar W" se envía después de que el servidor procesa la información.
Aquí hay un diagrama de retraso para ayudarlo a comprender lo que quiero decir: http://i.imgur.com/Prr8K.png
Podría enviar un paquete "W Presionado" a cada trama para que el servidor lo procese, pero eso parece ser una solución costosa para el ancho de banda.
Cualquier ayuda es apreciada!
fuente
Entiendo tu pregunta como:
El servidor recibe un paquete cuando comienzo a presionar el botón "reenviar" y otro paquete cuando finalmente suelto el botón "reenviar". Por lo tanto, el movimiento real en el servidor comienza y termina aproximadamente 100 milisegundos 'demasiado tarde' en el juego real frente a lo que el jugador está expresando en el lado del cliente. Entonces, si el jugador quiere moverse 10 segundos, puede terminar moviéndose 10.x segundos en lugar de estar en
x >= 1
línea.Esta es una mala estrategia de diseño porque no expresa la voluntad del jugador en el mundo del juego como el jugador pretende, creando una experiencia de usuario bastante pobre.
La solución que recomendaría es enviar un paquete (tan a menudo como sea posible) que indique cuántos pasos tomó el jugador y en qué dirección. El servidor luego actualiza el mundo del juego con la nueva ubicación del jugador si pasa una verificación de corrección. Por lo tanto, el jugador puede moverse con gran precisión y evitar caerse de las repisas altas.
La alternativa sería recordar las posiciones del jugador en el último segundo y corregir la posición en retrospectiva al momento en que se soltó el botón. Parece que crearía ese efecto de banda elástica de los viejos tiempos (solo por una razón diferente)
Básicamente, debería enviar un paquete de qué botón se presionó y cuál fue la hora real del juego en que se presionó el botón y luego, qué botón se soltó y en qué momento exacto.
fuente