2011-01-18 20 views
5

estoy desarrollando un juego de rol multijugador, (No, no es un MMORPG;).Multijugador suave movimiento

Mi configuración actual es así.

El cliente le dice al servidor "Quiero avanzar"/"Quiero ir hacia atrás", el servidor luego actualiza su entidad, e informa a todos los clientes en el área sobre el cambio. El servidor también está actualizando cada entidad cada 20 ms y enviando actualizaciones cada 100 ms a los clientes, estas actualizaciones contienen posición, velocidad, rotación, etc.

Hasta ahora todo bien, pero no tengo nada reservado para suavizar el movimiento entre los paquetes del lado del cliente, y debo decir que no puedo hacerlo funcionar. He estado leyendo sobre la predicción, la interpolación, el engaño, pero todo es un gran desastre para mí.

Así que ahora estoy haciendo algo así como "Position = Packet.Position", que causa un movimiento muy tartamudo.

Entonces, con lo que quiero ayuda es, ¿cómo obtengo un movimiento más suave? He estado mirando la muestra de predicción de XNA, pero no pude hacerlo bien.

Gracias // F

+0

¿Necesita suavizar el movimiento del jugador u otros objetos también? ¿Conoce el cliente la velocidad actual del jugador? – ssmir

+0

Bueno, actualmente solo tengo jugador, esa es mi principal preocupación. El cliente conoce la velocidad, está incluida en el paquete de estado del servidor. En realidad recibí una buena respuesta en el IRC, lo intentaré mañana y si es exitoso lo compartiré. –

Respuesta

3

me gustaría sugerir la idea de another question (véase la respuesta aceptada)

Aquí el cliente calcula su posición como si no es un juego de red. El cliente envía regularmente su posición actual al servidor. Y si el cliente hace trampa o no puede continuar moviéndose en la dirección elegida, el servidor solo envía al cliente su posición correcta.

El mismo algoritmo se utilizó en Ultima Online (al menos cuando yo estaba jugando hace 10 años)

+0

Es curioso cómo mencionas Ultima Online, es uno de mis juegos favoritos. :) Si encuentro problemas con mi implementación actual, intentaré esto. Sin embargo, ¿no será este el resultado en una gran diferencia entre lo que ven el jugador A y el jugador B? –

+0

@Fredrik Yep, uno de mis favoritos también =) En realidad, la diferencia dependerá de los pings de los jugadores y se puede estimar. Pero no creo que la diferencia desempeñe ningún papel aquí porque, p. cuando atacas a alguien en UO, el cliente envía la identificación del objeto que está siendo atacado. Por lo tanto, algunas diferencias en las posiciones pueden ser solo notorias si coloca dos monitores cerca uno del otro y los compara. Los problemas deberían comenzar a aparecer cuando ejecuta el juego a través de Internet en lugar de LAN. Especialmente si usa TCP porque cualquier pérdida de paquetes resulta en un enorme retraso medido en segundos (al menos). – ssmir

0

Lo resuelto mediante la ejecución de una entidad fantasma junto con mi principal.
El fantasma también se actualizará cada cuadro, pero cada vez que un paquete entra, sus valores se establecen en los valores del paquete.

Luego, gradualmente modifico la entidad real hacia donde está el fantasma.

+0

por lo que todavía tiene un retraso entre el momento en que el jugador inicia el movimiento y el momento en que el fantasma recibe la nueva posición? – ssmir

+0

Sí, sin embargo, esto no es notorio. –