Tema: Juego MMORPG
Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/12/2015, 13:38
xonil
 
Fecha de Ingreso: enero-2006
Mensajes: 76
Antigüedad: 18 años, 3 meses
Puntos: 1
Juego MMORPG

Hola de nuevo a todos. Les planteo una duda que tengo, he de decir que aun no me he puesto a escribir el código, pero si explico la pequeña historia de donde parte la idea, me entenderán mejor lo que quiero conseguir.

La historia es muy simple, me propuse hacer un juego multijugador tipo navegador en tiempo real, exactamente un juego de ajedrez. Es decir, entrabas en la web, te registrabas/loqueabas, y le dabas a jugar, entonces se quedaba tu navegador en espera de un oponente. Si otro usuario, le daba a jugar, el sistema los emparejaba y redireccionaba a ambos a una página donde aparecía un tablero de ajedrez, uno lo veía desde el punto de vista de las blancas y el otro desde las negras. Cuando el jugador de las blancas hacia un movimiento, al instante le aparecía ese movimiento en el navegador del contrincante, y el turno le pasaba al negro, y así sucesivamente. Todo esto incluido las jugadas legales de las fichas, como el enroque, tomar al paso etc, lo conseguí, y supongo que la mayoría de veteranos lo conseguirían con un esfuerzo mínimo. De hecho lo hice con sockest, un servidor en php y los clientes en javascript. Pero he aquí uno de los problemas con los que me enfrentaba, si un jugador le daba a refrescar la página, se cargaría la página con el tablero y las fichas desde la posición original, no la actual, luego aún tenia que resolver el problema del tiempo de ambos jugadores con las recargas de páginas (ya se sabe, uno tiene que prever del cliente/usuario las acciones que no deberían de hacer), para la colocación de las piezas a la posición actual con las recargas de página que el usuario hiciese, había previsto el guardar la posición de la partida en cada movimiento con el sistema storage que trae html5, parecía rápido y tal, pero lo del tiempo lo veía un poco complicado, ya que una de las modalidades del juego de ajedrez online es el añadido de tiempo por jugada, y en las recargas lo veía chungo y seguro que no sería ni muchísimo menos real. El juego en si está soportado por el cliente, ya que el código está escrito en javascript, y este se ejecuta en el lado del cliente, con lo que el servidor solo se encargaba de hacer de repetidor o comunicar a ambos jugadores de sus movimientos. Pero para hacerlo bien, y por lo que he podido deducir de las páginas que están funcionando, la recarga no les afecta nada, solo el clásico retardo de recarga, pero el tiempo que se carga es real, y lo otro es que en las partidas que se están jugando, cualquier otro usuario puede verlas metiéndose en la partida en cualquier momento de la partida, pudiendo ver el tiempo de cada jugador. Con lo que deduzco que la partida es tratada por el servidor y no por el cliente en el navegador.
La comunicación no lo veo muy complicado y aunque sea en ingles, hay buena documentación en internet para hacer un servidor sockets en C, pero...
Yo así pensando he llegado a la conclusión de que, cuando dos clientes le dan a jugar, el programa que esta ejecutándose en la memoria del servidor, crea una instancia de un objeto en memoria, de la clase partida, pero,... si otro par de jugadores le dan a jugar, crearía otra instancia de la clase partida, y ahora viene la duda, cuando los jugadores de la primera partida hacen un movimiento, como le digo al programa servidor que objeto de que partida ha de atender?
Igual me estoy liando yo solo, pero yo entiendo que al estar corriendo el programa en el servidor, al recibir una petición por un sockets, este responde a la petición, y si empieza por la creación de un objeto de la clase partida, luego ¿como se hace para retomar ese objeto ante las sucesivas peticiones de los jugadores que han sido los responsables de la creación de ese objeto, entre los múltiples objetos que habrán creado otros jugadores?
Lo de identificar a cada usuario conectado con un identificador único lo tengo asumido, pero en código, no se exactamente como acceder a las distintas instancias del objeto partida.

Gracias de antemano.