Cómo haríais un juego multijugador
Buenas, quizás este tema debería estar entre Programación Cliente y Programación Servidor, pero yo lo lanzo igualmente.
Estoy pensando en crear un juego en Flash Multijugador. La cuestión es que nunca he hecho nada parecido, ni un triste chat. Suelo combinar Flash y XML pero esto no lo he tocado aún. Sé que me llevará mi tiempo, por eso antes de empezar me gustaría preguntaros unas cuantas cosas. Me han recomendado www.smartfoxserver.com y me han dicho que tendría que hacerlo mediante sockets, pues bién la pregunta es esta es la forma más correcta y cómo lo planteariais vosotros.
Para que os sirva de guia el juego no lo es en sí, pero vendria a ser muy parecido a un juego de cartas, entras en el site, una sala de chat, "te sientas en una mesa" y esperas al segundo jugador, jugais, podéis chatear mientras jugais y se van cruzando unos cuantos datos (no muchos, casi ninguno).
Muchas gracias de antemano. Y si alguien quiere ayudarme altruistamente se lo agradeceré muy mucho.
marcosmedina
Vale, ahora voy a coger lo que hay escrito aquí y me pondré a buscar que significa... XD
Muchas gracias por todo, seguiré informando de los avances y tal, de momento estamos con el diseño, cuando pasemos a la fase de programar ya os avisaré. Pero no pararé de informarme y hacer pruevas antes de comenzar en serio.
dagi3d
y si al final te decides, también te recomendaría que le eches un vistazo al tema de 'máquinas de estado', ya que no es algo muy difícil de entender y te simplifica bastante las cosas a la hora de programar videojuegos
oskitar
si si, si parece facil, pero ya verás como se va complicando, por ejemplo si yo retoa alguien que esta en la lista de usuarios conectados,es decir envío un mensaje de reto al servidor, y el servidor le devuelve un ,mensaje de reto al retado, que pasa si en ese momento tambien otro usuario envia un reto a ese retado, a quien de los dos aceptas, en el momento en el que por ejemplo el retado reciba una invitación de reto el servidor tiene que decir al retado y al retador que salgan de la lista de usuarios para retar.
El retado tendrá que enviar un mensaaje de que ha recibido una invitación y no esta en disposicion de recibir más aunque luego la rechace...
Te pongo el ejemplo de lo que puede empezar a ser un dolor de cabeza y eso que todavía no me he puesto a contar cosas de la mecánica del juego.
Por ejemplo estás jugando, ¿que pasa si un usuario abandona una partida a la mitad?
¿si pierde la conexión? ¿si tarda mas de un rato en enviar su acción de juego? ¿si el servidor no recibe su acción de juego?
Envía mensajes de fin de turno, acciones automáticas en caso de que venza el tiempo máximo de turno, envia un mensaje de victoria al rival si el servidor detecta que uno de los dos abandona la partida...
Gana la partida y almacena sus datos en el servidor, cierra la partida actual, añade a la lista al jugador que abandonó la partida y al otro...
Lo que comentas de enviar datos en una cadena y luego parsear, puede parecer una solución buena, pero no lo es, lo mejor es que redactes tus protocolos de comunicación y tipos de datos que se van a manejar, vas a necesitar mas protocolos de comunicación de los evidentes.
Cosas como:
Fin de turno.
Nuevo turno
Acción de juego
Invitación a partida
Rechazo de partida
Abandono de partida
Logueo
Resultado de acción de juego
Fin de combate
Ganador del combate
Información de rival
Configuración de juego
...
De modo que en el momento en el que tienes tantos datos y tan variados ya no es tan buena idea enviar cadenas y parsear datos.
Sobre todo pensando luego en la depuración de errores y en las modificaciones.
de todas formas si te animas, adelante.
dagi3d
si al final te decides por un servidor de sockets, lo que te recomendaría es que te diseñaras un protocolo basado en xml para las comunicaciones, ya que luego a la hora de parsear todo te resultará mucho más sencillo
marcosmedina
A ver, no soy muy dado a esto, pero por algo se empieza, para instalar software en el servidor ¿no te tiene que dar permiso la compañía que te ofrece el hosting e incluso instalarlo ella misma?
marcosmedina
Gracias por el susto. XD
A ver, mi juego no es síncrono como dices tu, tal vez me expliqué mal. Es un juego por turnos, más o menos, y digo más o menos pq si fuese necesario se podria hacer de manera que lo único que pasase por el servidor fuera el chat y 10 variables más (a lo sumo), que se podria convertir en una sola cadena de texto y luego separar en variables, rollo 301060 donde 30 es el numero de munición, 10 el nivel de dificultad y 60 el tiempo del "turno" (por poner un ejemplo, no hay ni balas ni leches en el juego). La verdad es que seria muy parecido al juego de los barquitos. ¿Salas de chat? Con una ya es más que suficiente y con un limite de 20 usuarios para empezar creo q me basta y me sobra. En el fondo es un juego de preguntas que solo pueden ser respondidas mediante un Sí o un No. Dependiendo de las respuestas de tu contrario debes adivinar cuál es el enigma que esconde (dado por el juego at random). Es exactamente como un ¿Quien es quien?, aunque a la larga me gustaria ponerle niveles de dificultad, que son los datos que habria que cruzar (el usuario 1 escoge y el usuario 2 los recibe y su flash los interpreta, estableciendo el número de cartas, etc), pero para el inicio, con uno básico voy que me estrello.
Ala, espero que os haya aclarado todo mejor.
oskitar
Hacer un multiplayer online es un infierno, te lo digo yo que acabo de cerrar un proyecto de un multiplayer y mi compañera de curro y yo hemos acabado un poco desquiciados. Te hablo ne este caso de un multiplayer por turnos, un multiplayer síncrono no quiero ni saber lo que tiene que ser.
El principal problema que hemos tenido ha sido la sincronia de eventos entre uno y otro jugador, hacer un juego de los barquitos es facil, pero si te pones a hacer juegos por ejemplo de lucha o laberintos, vas a tener que sincronizar un montón de situaciones, enviar respuestas a tus acciones,esperar eventos, ejecutarlos simultaneamente, evaluar respuestas del servidor, supeditar acciones a las respuestas de tu contrario... como digo es un tema serio de comunicación entre el/los clientes y el servidor. Y eso suponiendo que crees una herramineta comunicadora entre cliente y servidor transparente.
Estos juegos ademas tienen mas capas de abstracción que las aplicaciones normales a las que estas acostumbrado.
Tienes que definir los protocolos de comunicación , programar el servicio de sockets en el servidor, si guardas datos en el servidor tendrás que gestionar BBDD, el gestor de comunicadores en los clientes, la sincronización de los eventos gráficos, las salas de chats donde encontrar a tus rivales, la distribución de los ususarios por las salas, el número máximo de usuarios en salas ....
Millones de cosas que ni te imaginas hasta que no estas metido en faena.
El "debugueo" o depuración de errores, es tambien para tirarse de los pelos. Porque tienes que averiguar leyendo logs por ejemplo que datos has mandado al servidor que datos se han recibido, porque se ha recibido una cosa antes que otra, porque no esta recibiendo tal dato, el lag en la recepción de datos...
Es un proyecto tocho así que si te quieres meter a hacer uno te recomiendo que primero desayunes bien y pierdas mucho pero que mucho tiempo definiendo el proyecto, los protocolos, la mecánica del juego, los gestores de comunicación, que parte se va a calcular en el servidor y que parte la realizará el cliente...
juandelgado
Sí lo quieres hacer en Flash tienes 2 opciones, y para ambas necesitas instalar software en el servidor:
1 - Servidor de sockets. Yo diría que es la forma "antigua" (no es despectivo), pero igualmente válida. Servidores de sockets para Flash hay unos cuantos: Unity, ElectroServer, SmartFoxServer y seguro que alguno más. Algunos creo que son de pago, otros no.
2 - FlashMediaServer o su hermano Open Source, Red5. Cualquiera de estos 2 te permitiría mucho más que hacer juegos multijugador, ya que incluyen streaming y grabación de audio y video, por ejemplo.
Siento no poder darte mucha información de primera mano porque no he utilizado personalmente la mayoría de lo que te cuento, sólo he hecho pruebas (satisfactorias) con Red5 para grabar vídeo. Si quieres ejemplos, en la página de Red5 los hay y funcionan más o menos bien.
Pues no sé si esto que te he contado te ayuda, espero que sí.
Salud!