Tutorial de como hacer un juego multiplayer
Una de las demos más difíciles de entender que viene con Game Maker Studio es la del juego multiplayer (o multijugador). Primero, porque utiliza un juego de plataformas y la parte de programación no es sencilla, usando números binarios para detectar las colisiones, y si a esto le sumas toda la parte del código para que funcione en red, te queda un proyecto muy completo, pero difícil de entender para poder hacerlo tu mismo.
Aquí voy a explicar una manera muy sencilla de como crear un proyecto que puede funcionar como multijugador. ¡Vamos a verlo!
Algunos conceptos a entender
Antes de nada, hay que entender algunos conceptos para saber como funciona un juego multiplayer. Para hacer toda la programación que funcione en red, necesitamos un servidor y un cliente.
Un servidor no deja de ser un ordenador, o un dispositivo cualquiera, que suele almacenar datos, pero sobretodo envía datos a los clientes.
¿Y un cliente que es? Pues el ordenador que recibe esos datos que envía el servidor.
Tanto el cliente como el servidor puede tratar esos datos para que funcione todo correctamente.
Para decidir como se envían y reciben esos datos, se suele utilizar protocolos estandar, como puede ser el TCP/IP, así que todo suele funcionar de la misma manera, ya sea un servidor web que almacena páginas o un juego multijugador que hacemos en Game Maker Studio.
Creamos un ejemplo sencillo
Vamos a crear un proyecto nuevo en Game Maker Studio. Ejecutamos la aplicación, vamos a la pestaña de New y creamos el proyecto Server. Creamos un nuevo objeto que usaremos como servidor. Vamos a Resources-Create Object y le damos el nombre de obj_server. Hacemos click en el botón Add Event y añadimos Create. Vamos a la pestaña de la derecha Control y arrastramos Execute Code. Añadimos el siguiente código:
server = network_create_server(network_socket_tcp, 6510, 32); player_buffer = buffer_create(16384, buffer_fixed, 1);
La primera línea crea un socket en el servidor del tipo TCP, y le ponemos un puerto que no utilice el dispositivo, por ejemplo el 6510. Luego creamos un buffer que será dónde almacenaremos la información que vendrá del cliente.
Creamos el proyecto Client. Creamos un objeto llamado obj_client, le añadimos un evento Create y añadimos un Execute Code. Añadimos el siguiente código:
client = network_create_socket(network_socket_tcp); network_connect(client, "127.0.0.1", 6510); buff = buffer_create(256, buffer_grow, 1);
En el código vemos que creamos un socket de tipo TCP, y nos conectamos al servidor 127.0.0.1 con el mismo puerto que hemos comentado antes, el 6510. ¿Qué significa 127.0.0.1? Es la dirección IP para hacer pruebas en nuestro ordenador. De esta manera, no buscará la red sino que siempre buscará en nuestro ordenador que exista el servidor.
Ya hemos creado los proyectos y objetos necesarios para probar la comunicación. Ahora vamos a mandar un mensaje del cliente al servidor, el servidor lo capturará y lo mostraremos en la ventana de compilación.
Nos vamos al proyecto Client, y en el objeto obj_client, añadimos una línea al código que hemos creado en Create.
alarm[0] = 10;
De esta manera activaremos una alarma. Añadimos el evento de Alarm, y elegimos Alarm 0. Añadimos un Execute Code y ponemos lo siguiente:
client_name= "player " + string(round(random(99))); buffer_seek(buff, buffer_seek_start, 0); buffer_write(buff , buffer_string, "check_name"); buffer_write(buff , buffer_string, client_name); buffer_size = buffer_tell(buff); network_send_packet(client, buff, buffer_size); alarm[0] = room_speed;
Explicamos el código. La primera línea asignamos a la variable client_name
un texto, que será player XX, dónde XX será un número aleatorio. En el siguiente párrafo, la variable buff
que hemos creado, la iniciamos para que se posicione al principio del búfer, le añadimos el texto check_name, luego el texto de la variable client_name
y lo enviamos mediante la función network_send_packet
, calculando previamente el tamaño del búfer con buffer_size
. En el caso actual solamente vamos a mandar un mensaje de texto, pero siempre vamos a enviar antes un texto de identificación para saber qué datos recibe. Para eso es el texto check_name que ponemos al principio.
Al final volvemos a arrancar alarm[0] para que vuelva a enviarlo cada segundo (utilizamos room_speed para la activación de la alarma y así calcularlo en segundos).
Ahora vamos al proyecto Server. Para capturar lo que envía el cliente, utilizamos un evento que está al pulsar el botón Add Event Asynchronous – Networking. Para añadir código, arrastramos Execute Code y ponemos lo siguiente:
net_buff = ds_map_find_value(async_load, "buffer"); if (is_undefined(net_buff) == false) { buff_info = buffer_read(net_buff , buffer_string); if (buff_info == "check_name") { //check if name exists b_name = buffer_read(net_buff , buffer_string); show_debug_message(b_name); } }
Explicamos el código. Antes de nada, buscamos en el mapa async_load
. Game Maker Studio crea un mapa (es un tipo de datos, también se suele conocer como diccionario) especial que contiene información sobre los eventos de red. En nuestro caso, ponemos en la variable net_buff
la información del buffer que recibimos y lo leemos en la siguiente línea con buffer_read
.
Ahora vamos a ver que contiene el búfer. Hemos comentado antes de usar un texto de identificación para saber qué datos provienen del cliente. Por eso comprobamos si en buff_info
viene el texto check_name. Si es correcto, leemos el siguiente dato del búfer que sabemos que contiene el nombre y se lo asignamos a b_name. Ahora podemos tratar la información. Como el ejemplo es muy sencillo, lo único que haremos es mostrar un mensaje en la ventana de compilación.
Ahora vamos a probar que funcione todo correctamente. En cada proyecto, añadimos una nueva room, menú Resources – Create room, y en la pestaña Objects nos aseguramos que esté el objeto de cada proyecto. Hacemos click en la room para añadir ese objeto. Yo he cambiado el color en cada proyecto para distinguir cada room. Ahora ejecutamos el proyecto Server y, una vez arrancado (para que pueda encontrar el servidor) ejecutamos el proyecto Client. Vemos en la ventana de compilación del servidor que aparece el siguiente texto:
Si nos fijamos, en la ventana de compilación nos avisa cuando se conecta el cliente. Luego vamos los diferentes textos del player que va enviando el cliente cada segundo y, por último, vemos que también se avisa cuando se desconecta un cliente.
Resumen
Hemos creado dos proyectos por separado, para diferenciar lo que hace un servidor de lo que hace un cliente. El servidor captura lo que envía el cliente, así de sencillo. ¡Hemos conectado dos aplicaciones con unas pocas líneas de código!
Se podría hacer más pruebas y modificaciones el proyecto, como por ejemplo, crear el ejecutable del proyecto cliente y probarlo en otro ordenador, para ver que se conecta correctamente al proyecto del servidor de Game Maker Studio.
¿Quieres hacer tu propio juego multiplayer?
ACTUALIZACIÓN: De momento, el curso no está disponible hasta que lo haga en la plataforma Udemy.
Ya has visto que es muy sencillo hacer que dos proyectos se comuniquen entre ellos. A partir de ahí surgen algunas dudas: ¿Es posible enviar cualquier información entre ellos? ¿Se podría configurar todo en un único proyecto? La respuesta es SÍ.
Para resolver todas estas cuestiones, he creado un curso como hacer tu propio juego multijugador en Game Maker Studio. En el curso podrás encontrar:
Detalle de todos los conceptos necesarios para entender como funcionan los envíos de datos en una red.Crear un juego dónde el juego hace de servidor y un pad virtual hace de cliente.Hacer un juego multijugador, parecido a un MOBA que puedas jugar en diferentes dispositivos dentro de la misma red.
Para cualquier duda que te pueda surgir, puedes enviarme un mail a la página de Contacto.
############################################################################################
FATAL ERROR in
action number 1
of Async Event: Networking
for object obj_server:
buffer_read argument 1 incorrect type (undefined) expecting a Number (YYGI32)
at gml_Object_obj_server_NetworkingEvent_1 (line 2) – buff_info = buffer_read(net_buff , buffer_string);
############################################################################################
parece que dice que buffer_string es incorrecto, pero intenté poner buffer_u8, u16, s8, s16 pero aún así sigue dando el mismo error…
Curioso, el ejemplo funcionaba, supongo que con algún cambio de versión ha dejado de funcionar.
En realidad lo que es incorrecto de buffer_string es el primer parámetro, porque se lanza el evento pero aún no vale nada.
He añadido la condición siguiente como control:
if (is_undefined(net_buff) == false)
Hola que tal?, disculpa, tendrás algún ejemplo o podrías comentar como hacer funcionar el multijugador a través de internet, sin tener que abrir puertos, de manera ya más profesional. Saludos
Seguramente implica usar un servidor y comunicarse con él. Eos quiere decir pagar ese servidor, o un servicio que te de el soporte.
Disculpa como le puedo mandar algo al servidor osea del cliente -> servidor
Deberías de tener un objeto cliente en el proyecto del servidor, envías los datos y lo recuperas desde el otro lado.
Lo tengo todo igual pero en el momento que el cliente se conecta con el servidor, salta un error en el servidor
El error dice:
Variable get 100000.false
Object_ob_server_networkingevent_1 (line 2 – if (is_undefined(net_buff=false)
No se como arreglarlo y agradecería mucho que me dijeras como
¿Es posible que el if lo tengas mal escrito? Creo que los paréntesis no son correctos.
if (is_undefined(net_buff) == false)
Hola me gustaria saber si puedes hacer un tutorial donde ya al menos los jugadores puedan interactuar entre ellos… ¿Cómo seria la programacion digamos si se golpean entre ellos o golpean otro objeto y todos vean lo mismo?
Resumiéndolo mucho mucho, necesitas que uno de los que juegan haga de servidor y los demás se conecten a él.
Si usas Game Maker Studio 1.4, hay un demo multiplayer que es exactamente lo que quieres.
se puede en game maker 8.1?
En Game Maker 8.1 se hacía de otra manera, con un dll llamada 39.dll, aunque game maker tenia unas funciones llamadas mplays, que usaba directamente de Directx (creo). No se si funcionaría ya que están obsoletas.
Hola yo quiero hacer un fan game de smash bros pero en modo lan pero no me queda claro el hecho de hacer que una persona sea el servidor y los demás se conecten a el si puedes hacer un tuto te lo agradeceré eh incluso daré créditos a ti.
Necesitas que uno de los que jueguen se encargue de enviar los datos a los otros dispositivos. Si usas la versión GMS 1.4, mira la demo Multiplayer que explica como hacerlo.
me sale error en esta linea if (is_undefined(net_buff) == false)
¿Has declarado la variable
net_buff
? Es la línea anteriorNada ya está, lo que pasaba era que el puerto no estaba disponible, ya es casualidad xD
gracias por el tuto, es el mejor que he visto nunca, simple y conciso, sin enrollarse, gracias
Gracias por el comentario. El tutorial es la base para empezar, a partir de ahí puedes complicarlo lo que quieras. Además, te sirve para comprender mejor la demo que viene con GMS 1.4
hola, en lugar de poner la ip local, quisiera conectarlo a un servidor que compre, como lo hago? :C
Si el servidor tiene ip fija, y abres el puerto correspondiente, te debería funcionar. Recuerda que debes de tener el sistema operativo Windows y tu juego ejecutándose.
Como no tiene mucho sentido hacerlo, o si has contratado un hosting, tendrás que utilizar otro sistema, vía webservices, por ejemplo.
Hola, muy buenas, tengo una muy buena idea para un videojuego que quiero hacer, de un juego al de azar, pero ando buscando el programa ideal para crear tal juego, y tengo unas dos preguntas sobre GameMaker Studio 2, 1. Podría crear un juego de cartas con este programa y hacer que sea multijugador? 2. Y si es así que sea multijugador, necesito tener un servidor aparte o cómo? Muchas gracias
Juego de cartas, se puede hacer perfectamente. Incluso si buscas hay ejemplos ya hecho.
Para tema multijugador, si quieres crear un juego dentro de la misma red local puedes hacerlo con GML. Pero si te refieres a hacerlo mediante Internet, necesitas un servidor en el que los jugadores se tengan que conectar. También es posible hacerlo mediante Game Maker, pero necesitas usar alguna herramienta en el servidor, webservices o algo parecido, para que funcione.
hola, me ayudo mucho a comprender el problema es al crear el servidor en el computador de mi hermana y ejecutar el cliente en el mio no se conecta se queda un buen timpo ahi pero no se conecta, el cliente busca la ipv4 de el computador de mi hermana, no se por que no lo encuentra, y otra cosa es como el programa puede saber mi IP sin necesidad de buscar “ipconfig”
En GMS 1.4 hay una demo que lo hace, debes usar el protocolo UDP en vez del TCP. En la demo lo verás muy fácilmente.
gracias pana me ayudo mucho espero que usted y los suyos esten bien…ahh tambien averigue que el firewall de windows bloquea las senañes de entrada o salida
Depende del puerto utilizado es posible que el firewall lo bloquee, a mi me pregunta en el momento de ejecutar el juego.
MUCHISIMAS GRACIAS, espero que usted y los suyos se encuentren bien, suerte pana.
consulta, despues de todo esto que explicaste, como agrego personajes y que yo pueda ver cuando se mueven?
No entiendo, con el tema de crear un proyecto server, y en un comentario tuyo vi que hay q pagar x un servidor para mayor soporte, no es lo mismo? O en el proyecto server se pone algun codigo con numeracion q te brinda el servidor.
Como es este tema del proceso, de pago de servidor. Hay q pagar otras cosas para la creacion del juego en linea.
Este proceso es solo para una prueba de funcionamiento del juego. O cuando tengas un multijigador como among us o free fire, para q no colapse hay q hacer cosas adicionales?..
Puedes hacer que tu ordenador haga de servidor. Si hay pocos jugadores, no hay problema. El problema viene si quieres salida a internet. Puedes configurar que tu ordenador tenga salida a internet relacionando ips, o puedes contratar y pagar un servidor que ya esté fuera. Pero aquí viene otro probema, y es que estos servidores están orientados a temas web, como páginas, servicios, etc.
Si quieres hacer algo como Among US, necesitas buenos conocimientos de gestión de juegos online, como por ejemplo el tema de sincronización entre jugadores, gestión de salas y espera, etc.
Otra opción es crear tu juego pensando en multijugador local y usar servicios como Dixper.
Una pregunta eso codigo son compatibles con Gms 1.4 ??
Si, deberían de serlo.
Buenas amigo. Estoy pensando en hacer un videojuego en multijugador online, de partidas rápidas, mediante la gestión de salas y ese rollo. Tal como Pinturillo o Among Us. El punto es que me confunde un poco el rollo de como puedo comprar un servidor; como conecto el juego a dicho servidor; y como podría preparar ese servidor para recibir datos de mi juego.
Tengo buena experiencia en Game Maker, pero soy nuevo en el rollo este de los buffers y el online. Me gustaría saber si me podrías recomendar algún tutorial al respecto sobre esos temas de un server online, o bien decirme cómo podría hacer para empezar.
Saludos y Gracias de antemano.
Es una de mis tareas pendientes, intentar hacer un juego multijugador online (por internet).
Tengo que probar GMNET ENgine a ver como funciona
https://gmnet-engine.org/engine/
Hola soy Laufer Yovany Villasmil Sánchez
hola lo que dire no tiene que ver mucho con este tutorial pero talvez sepas como hacerlo. Lo que quiero hacer es que estoy creando un juego donde el personaje tendra como un superheroe que puede controlar (como un stand de el amime jojo`s) y lo que quiero hacer es que al presionar una tecla aparezca ese superheroe o objeto, tengo entendido que se puede hacer creando una instancia pero no se como usar gml y intente usar drag and drop pero no me funciono.
espero que lo veas pronto por que me quedan 11 dias de la prueba gratuita de gamemkaer xd
Como bien dices, debes hacer otro objeto y luego buscar la acción Crear instancia para que lo haga.
Hola, a ver si puedes ayudarme.
He creado un juego online que me funciona perfecto en la red local (127.0.0.1) tengo una ip publica con un puerto con rango 6510-6530 abierto en el router pero cuando accedo desde otra red que no es la local donde tengo abierto el juego en la parte servidor no me acceden.
No sé si tengo que montar un servido de juegos pero deduzco que ej:
tengo ip publica: 62.128.12.45 / puerto 6510 / redirección a la ip 192.168.1.100
Pregunto no debería poder conectar con mi juego online con el cliente si le pongo la ip publica 62.128.12.45—->redirigirme a 192.168.1.100 leerme el juego en modo servidor como me hace en la red local y así poder jugar?
o tengo que crear algún servidor para su redirección como cuando lo haces para redireccionar una web con entrada desde ip publica?
Muchas gracias y felicidades por tu web es muy buena y sobre todo extensa! tocas muchos palos sobre GM y es de mucha utilidad.
Muchas gracias de antemano
Buenas Pedro,
el ejemplo que he puesto y las funciones de red de GMS es para una red local. Si es para internet, funciona de una manera diferente, que yo aún no me he podido mirar para comprobarlo.
Recientemente Game Maker ha creado funciones de red dentro de su navegador Opera que facilita mucho estas opciones. Míralo a ver si te encaja.
como puedo crear 2 dos personajes en el mismo juego y cambiar cuando quiera??