17 oct 2004

17/10/04: Actualización

Diario de guerra de Alejandro González, Alias WaaghMan. Quincuagesimosegunda anotación:

Bueno, hace bastante que no me explayo hablando del PFC, así que ya toca, y de paso me organizo un poco las ideas.





Como se puede haber leído en un par de mensajes anteriores, en el juego ya se muestran los disparos, se cargan y muestran los mapas, y los personajes. Se detectan colisiones, existe un menú, y algunas cosas más.



En estos momentos estoy trabajando duramente en el protocolo de red, por así llamarlo. La teoría es sencilla: Suponiendo que se conoce la IP del servidor, un cliente se conecta a éste, y le hace una petición para entrar al servidor. Éste le contestará diciendo si puede (hay hueco en el servidor) o si no puede (se ha llegado al tope de jugadores).



En caso de que pueda, el servidor le da al cliente de paso el nombre del mapa que se está jugando, y (En teoría, aún no funciona esta parte) una lista con los archivos que el cliente debería tener para que pueda jugar bien en ese servidor (por ejemplo, los cuerpos de los jugadores que estén en ese momento jugando).



Una vez el cliente compruebe que posee esos ficheros y cargue el mapa, en teoría, debería mostrar la pantalla de Escoger Perfil, donde el jugador escogerá el que desee. Entonces, el cliente enviará el aviso de que va a introducir un personaje con los datos de ese perfil. Mientras el cliente escoge, el servidor le pasa los datos de los personajes en juego en ese momento.



El servidor debería (tampoco se hace aún, ya que no hay aún baremo de puntos) comprobar si la puntuación del cuerpo y el arma escogida no supera el límite impuesto por el creador de la partida, y en ese caso, añadir el jugador a la partida y avisar al resto de jugadores de que ha entrado otro más (Tampoco se hace aún).



Una vez dentro de la partida, la cosa es más sencilla: Cada cliente enviará cada cierto tiempo unos datos para sincronizar las cosas, con información de su posición y su estado. Además, en cada modificación al estado (comenzar o dejar de moverse, saltar, disparar, etc), se enviará un aviso al servidor. De esta forma la sincronización total se puede hacer cada más tiempo, y se ahorra ancho de banda.



Lo ideal para estas cosas sería que servidor y clientes incluyesen predicción de movimientos. El motivo es sencillo: Desde que un cliente envía sus datos hasta que el servidor los recibe, pasa un tiempo. Entre ADSLs este tiempo es de alrededor de 50ms, en LAN es desdeñable. Pero si la conexión está ocupada, este tiempo crecerá. En realidad, es fácil hacer esa predicción: Se calcula el tiempo de retardo del envío (la mitad del ping), y se calcula la nueva posición del personaje aplicando el estado recibido durante ese tiempo.



Es decir, si el personaje se estaba moviendo a la derecha, lo movemos a la derecha durante 50ms. De esta forma su posición, sin ser la ideal, estará mucho más cercana a la posición real que si no hiciesemos nada.



Tal y como está el proyecto en estos momentos, el mayor problema es la orientación a objetos. No lo considero un fallo del diseño (al menos no un fallo grave), simplemente el controlador de Red tiene que manejar demasiadas cosas del juego (cambiar personajes de sitio, manejar los mapas, añadir jugadores, etc.), de forma diferente si son cliente o servidor, y hay demasiados métodos repetidos porque los atributos son demasiado diferentes, a pesar de que hacen lo mismo.



De todas formas, una cosa la tengo clara: Una vez consiga que se pueda crear una partida de un número de jugadores mayor de 2 en la que los jugadores se puedan disparar y matar, y todo vaya correctamente y sin fallos, pausaré el desarrollo. Será momento para limpiar el código, añadir comentarios y pulir ciertos procesos. De esta forma espero que el código quede mucho más claro, sea más rápido y quede más bonito :).





Tiempo estimado hasta esa pausa: Una semana, si mi hermana no me da mucho la vara :S. Dos si lo hace :P.

No hay comentarios: