Juegos web multijugador utilizando JavaScript

Rate this content
Bookmark

Con las crecientes oportunidades para crear juegos multijugador en línea para diferentes plataformas, y muchas herramientas de código abierto accesibles y fáciles de usar, se ha vuelto mucho más conveniente para los desarrolladores crear emocionantes juegos multijugador. En esta charla, Sahar creará un juego multijugador simple para demostrarlo y hablará sobre los problemas que enfrentó al crear sus propios juegos.

34 min
08 Apr, 2022

Video Summary and Transcription

La charla de hoy trata sobre la creación de un juego web multijugador utilizando Phaser y Socket.io. El orador demuestra cómo crear un juego de tres en raya, incluyendo la creación de la tabla, asignación de jugadores, realizar movimientos y determinar el próximo turno. Se discute la importancia de elegir el protocolo adecuado para juegos multijugador, como WebSocket o UDP. La charla también destaca las ventajas de utilizar JavaScript para juegos web y móviles, así como consideraciones para el código de red y disponibilidad del código.

Available in English

1. Introducción a los juegos web multijugador

Short description:

Hola a todos. Soy Sahar Poundasseh, un desarrollador de juegos independiente de Irán. Hoy les mostraré cómo crear un juego web multijugador utilizando Phaser y Socket.io. Construyamos juntos un juego de tic-tac-toe. He preparado previamente algo de código y lógica. En mi servidor Node.js, he instalado Express y Socket.io e implementado un archivo index.html. Genero un token para la sala utilizando un número aleatorio de cuatro dígitos. En el archivo index.html, importo la plataforma Phaser y utilizo socket.io. El código incluye un archivo de configuración de Phaser con cuatro funciones principales.

Hola a todos. Mi nombre es Sahar Poundasseh, como ya me conocieron antes. Soy un desarrollador de juegos independiente con sede en Irán, Teherán, y trabajo en un estudio de juegos llamado GearBag. Estoy aquí para hablar sobre juegos web multijugador. No soy muy buen orador, así que quiero mostrarles en acción cómo pueden crear un juego web multijugador desde cero y lo fácil que es, para que no se confundan con las complejidades. Voy a utilizar Phaser como mi motor y Socket.io Node.js como mi servidor, pero pueden usar cualquier cosa. Lo básico es que vamos a utilizar WebSocket y eso es todo. Espero que lo disfruten. Así que construyamos nuestro juego. Vamos a crear un juego de tic-tac-toe, uno simple, pero como no tengo mucho tiempo y no soy muy rápido escribiendo, he preparado algo de código, algo de lógica de antemano, el juego y cosas así. Vamos a completar el código de nuestra red juntos. Aquí en mi servidor Node.js, solo he instalado Express y Socket.io e implementado e importado un archivo index.html. Y estoy sirviéndolo aquí. Y solo tengo una función que genera un token para la sala. Es un número aleatorio de cuatro dígitos. Voy a usarlo con cuatro dígitos. Y por qué uso esto es porque me gustan los códigos de sala y me hace sentir especial como un VIP. Me gusta implementarlo en mis juegos. Y en mi archivo index.html, tengo estos dos archivos. He importado la plataforma Phaser y también he implementado, déjenme ir aquí abajo. También he implementado socket.io. Está construido sobre WebSocket, por lo que básicamente es WebSocket, pero estoy usando socket.io en este momento. En el código que está aquí, lo explicaré muy rápido. Es mi archivo de configuración de Phaser. Solo tiene el ancho y alto y tiene cuatro funciones principales, create init, preload y update para la escena. Solo tengo una escena. Estoy usando la función init y create. En mi init tengo algunas variables como el personaje del jugador y el registro de juego.

2. Creando la Tabla y la Interfaz de Usuario del Juego

Short description:

Voy a mantener mis caracteres en la información de la tabla. El índice de la tabla, las métricas de la tabla, contiene unos y menos unos para las entradas de los jugadores. La tabla tiene un contenedor, un personaje y una zona para hacer clic. Estoy comprobando si es el turno del jugador y si el personaje de esa zona está vacío. Hay dos cuadros para la interfaz de usuario del juego, un cuadro de bienvenida y un cuadro para los botones de crear/unirse a la sala. Conectaré nuestro cliente al servidor de sockets.

que bloqueará al jugador si no es su turno. Y están vacíos. Y la información de la tabla, en la que voy a mantener mis caracteres solo para hacer un seguimiento de ellos. Y el índice de la tabla, las métricas de la tabla, que contiene unos y menos unos. Entonces, si el jugador ingresa O, será uno. Y si el jugador ingresa X, será menos uno. Solo estoy usando esto para verificar el anillo. Y algunas dimensiones de la tabla y dimensiones de celda y posiciones iniciales de la tabla.

Y en mis creaciones, he creado la tabla. Así que es un contenedor y phaser. Y tiene un personaje, que está vacío en este momento. Y contendrá X y O, y una zona para hacer clic. Y estoy guardando este personaje en la información de la tabla aquí mismo. Con un ID de lugar. Entonces, en lugar de usar I y J por separado, estoy usando un lugar del cero al ocho para gestionar mis lugares al hacer movimientos dentro del juego. Y esto es un evento de clic para la zona. Entonces, en este evento de clic, antes de emitir el movimiento al servidor y a los otros jugadores, estoy comprobando si es el turno del jugador y si el personaje de esa zona está vacío. Entonces, si ya hay algo allí, no lo estoy emitiendo. Y esta es la tabla. Y tengo dos cuadros. Es solo la interfaz de usuario del juego. Es un cuadro de bienvenida. Que escribirá bienvenida y mostrará el token de la sala al creador. Y hay un cuadro para contener dos botones para crear sala y unirse a sala. Y hay dos funciones para el escucha de clics. Entonces, cuando hacemos clic en crear una sala, debemos emitir a nuestro servidor que debe crear una sala para nosotros. Y para unirse, voy a tomar el token de la entrada del usuario y voy a emitir esto al servidor después para unirme a la sala. Y aquí hay un texto simple para mostrar un inicio y si es tu turno o no o si estás jugando con X o O. Y eso es todo, muy simple. Así que comencemos con nuestro lado del cliente. Lo primero que debemos hacer es conectarnos.

3. Creando una Sala y Asignando Jugadores

Short description:

Cuando el jugador abre el juego, se conecta al socket. El primer paso es crear una sala emitiendo 'crear sala' al servidor. El servidor genera un token de cuatro dígitos y une al usuario a la sala. Se notifica al usuario que se ha creado la sala con el token. El servidor mantiene una lista de jugadores y sus salas, asignándoles personajes.

nuestro cliente al servidor de sockets. Así que crearé mi escena. Esto se llamará cuando el jugador abra el juego. Voy a abrir mi socket y conectarme a él. Así que este lado, el socket está abierto. Voy a conectarme a él. Así que el jugador estará conectado al socket de esta manera. Y estoy guardando una referencia a él, pero este es ese socket. Ahora lo primero que vamos a hacer es crear una sala. Entonces el usuario solicitará, por favor socket, por favor crea una sala para mí. Emitirá 'crear sala'. Ahora, si vamos a hacer esto paso a paso, volvemos a nuestro servidor y escuchamos 'crear sala' porque el usuario lo está solicitando. Así que aquí mismo, en la conexión, io.onConnection, obtendremos un objeto de socket que se refiere al usuario que se ha conectado a nuestro servidor de sockets. Usaremos esta conexión mucho. Así que en esta conexión, escucharemos, socket.on 'crear sala'. El usuario no nos pasará nada. Están solicitando un token de sala y una sala que se cree. Así que haremos eso. Entonces const token = generar token, el método y será de longitud cuatro. Y ahora lo que vamos a hacer es unir a este usuario a esta sala. Entonces socket.join en esta sala. Este socket tiene una referencia al usuario y luego se unirán a esta sala con este token. Y luego vamos a hablarle al usuario de que su sala ha sido creada y este es el token. Envíalo a tus amigos para que puedan jugar contigo. Para hacer eso, vamos a emitir al usuario que su sala ha sido creada. Y este es su token de sala. Así que su sala ha sido creada y se han unido a ella. Pero antes de volver a nuestro lado del cliente, voy a hacer una cosa más. Voy a mantener una lista de mis jugadores solo para tener un ojo en ellos. Es un área vacía allí en mi servidor y voy a agregar en ella el id de este jugador y su sala. Su id será second.id y su sala será este token. Lo usaré más adelante y les asignaré un personaje.

4. Asignación de Personajes y Compartir Token de Sala

Short description:

Les asignaré el personaje x porque se unieron primero. La sala ha sido creada y emitirá un token de vuelta. Ocultaremos la caja de selección y mostraremos la caja de bienvenida con el token de sala para compartir.

aquí. Les asignaré el personaje x porque se unieron primero, pero también pueden asignarlo al azar y hacer un seguimiento más tarde. Y la sala ha sido creada, por lo que emitirá de vuelta, nos hablará de vuelta qué sala se creó y un token. Así que vamos a escuchar eso justo aquí. En nuestro lado del cliente vamos a escuchar eso. Así que cuando se cree la sala, nos dará un token. Y lo que vamos a hacer con este token es que tengo el código. Es solo cosas de la interfaz de usuario, así que no lo voy a escribir. Voy a ocultar la caja de selección y mostrar la caja de bienvenida y decir que su token de sala es esto que obtuvimos aquí y ellos pueden compartirlo con sus

5. Unirse a la Sala y Verificar Disponibilidad

Short description:

El siguiente paso es que el otro usuario emita un token para unirse a la sala. Escuchamos el evento 'joinRoom' en el servidor y verificamos si la sala existe. También verificamos el número de jugadores en la sala.

. Lo siguiente que vamos a hacer es que el otro usuario quiere unirse a la sala por lo que tendrá que emitir, this.socket.emit.joinRoom y nos enviará un token ¿verdad? El token que obtuvimos del mensaje. Así que volvamos a nuestro código del servidor vamos a escuchar para joining.socket.on.joinRoom y obtendremos un token ¿verdad? Y justo aquí básicamente estamos haciendo lo mismo que al crear la sala, pero primero tenemos que verificar si la sala realmente existe. Así que voy a verificar con this io.socket.rooms.get para encontrar esta sala y ver si existe y también lo que voy a hacer a continuación es verificar

6. Joining the Room and Starting the Game

Short description:

Voy a verificar si ya hay dos jugadores en la sala. Si es así, la sala no está disponible. Luego, uniré al usuario a la sala y los agregaré a la lista de jugadores. La sala está llena, así que notificaré a ambos jugadores que el juego está comenzando. Emitiré el evento 'start game' a los oponentes del jugador que solicitó unirse, pasando información sobre la sala, los personajes y el turno. Al jugador que se unió, les notificaré que el juego está comenzando y les proporcionaré información sobre la sala. Si la sala no está disponible, emitiré un error. En el lado del cliente, escucharé el evento 'start game' y asignaré el token de la sala, el personaje del jugador y el bloqueo de juego basado en la información recibida.

Voy a verificar si ya hay dos jugadores en la sala. Si es así, la sala no está disponible. Luego, voy a unir a este usuario a la sala y luego los agregaré a mi lista de jugadores. Entonces, el ID del socket es el mismo, el token es el mismo, pero su personaje será... oh, si estás aleatorizando eso, tienes que verificar los jugadores para los oponentes y luego establecer el personaje para ellos. Y luego, lo que voy a hacer es que la sala ha sido creada, ya hay dos jugadores, así que la sala está llena, ahora el juego debe comenzar. Así que tengo que emitir a ambos jugadores que el juego está comenzando y esto es la información. Así que voy a hacer cada uno de los emit por separado para los dos jugadores. Solo hay dos jugadores, así que es muy fácil. Así que con este token emitirá a esta sala excepto para el remitente. Emitirá a los oponentes del jugador que ha solicitado unirse. Y les voy a emitir que el juego está comenzando, así que 'start game' y luego voy a pasarles información. Como tu sala es este token y estás jugando como X y es tu turno de jugar. Así que el turno es verdadero. Si aleatorizas los personajes, tienes que leerlo de ahí, pero lo estoy poniendo aquí porque es más fácil. Y luego, al jugador que ha solicitado unirse, solo voy a decirle 'start game', tu sala es esta y estás jugando con O y no es tu turno de jugar, así que se volverá falso. Ahora los hemos unido y emitido start game. Antes de volver allí, tenemos que tener un else. Lo vamos a verificar más tarde. Y si la sala no está disponible, voy a emitir de vuelta que hay un error. Bien, ahora volvamos a nuestro cliente. Ahora aquí tenemos que escuchar el evento 'start game' de la sala. Entonces, this.socket.on('start game') nos dará alguna información. Déjame ver si puse la información correctamente. Sí. Y aquí mismo, lo que vamos a hacer con esta información. Asignaremos el token de la sala aquí mismo porque lo vamos a usar más adelante. Así que info.room y el personaje del jugador,

7. Haciendo Movimientos y Determinando el Siguiente Turno

Short description:

Si es tu turno de jugar, el bloqueo sería falso. Muestra tu pieza y el texto de inicio. Después de eso, muestra la tabla. Los jugadores se han unido a la sala y han recibido un mensaje de inicio de juego. Para hacer un movimiento, emite el movimiento al servidor con la información de la sala y la posición. Escucha el movimiento en el servidor. Encuentra el personaje del jugador que hizo el movimiento para determinar el siguiente turno.

es igual a info.player. Y luego vamos a asignar el bloqueo, por lo que el bloqueo de juego será info.turno. Entonces, si es tu turno de jugar, el bloqueo sería falso. Y luego vamos a hacer algunas cosas bonitas que tengo aquí mismo. Muy bien. Y mostrará que tu pieza es esta. Y si es tu turno de jugar o no. Y voy a ocultar las casillas y mostrar el texto de inicio. Y después de que todo esté hecho, voy a mostrar la tabla en sí. Lo siguiente. Entonces los jugadores se han unido, creado y unido a la sala. Y han recibido un mensaje de inicio de juego del servidor. Ahora necesitan hacer un movimiento si es su turno. ¿Cómo vamos a hacer eso? Voy a volver aquí a la zona que creé para emitir el movimiento. Entonces, si es su turno de jugar y el personaje está vacío, vamos a hacer lo mismo. Así que este es el socket que emite. Y se ha realizado un nuevo movimiento. Vamos a pasar alguna información. Como la posición, primero la sala. La sala es este.roomToken. Y también la posición es la posición que establecimos antes. Entonces el número I por tres más J.

Y ahora esto emitirá y moverá al servidor. Así que tenemos que volver aquí y escuchar eso. Entonces obtengo eso en. Mover, estamos obteniendo información sobre el movimiento, ¿verdad? Y lo primero que voy a hacer es encontrar el personaje del jugador que acaba de hacer el movimiento, para determinar quién será el siguiente turno. Así que voy a manejar eso en mi servidor porque es más seguro de esa manera. Para hacer eso, voy a encontrar el jugador con este ID. Entonces el índice es igual a jugadores.map con una función que obtiene un jugador y devuelve ese ID. Y luego voy a encontrar el índice hacia arriba, segundo, ese ID. Así que voy a encontrar al jugador con su segundo ID, su ID de conexión. Y

8. Determinando el Siguiente Turno

Short description:

Entonces, el jugador actual será el jugador del índice y luego emitiré el movimiento, no, voy a encontrar el turno. Tenemos el nuevo turno, ahora vamos a decirles a los jugadores dentro de la sala que les toca jugar. Vamos a decir IO.to info.room.emit move. Y voy a pasar la información autorizada a esto. Veamos si... Bien, todo parece bien.

luego, si acabamos de encontrar al jugador, por lo que es mayor que menos uno, voy a obtener al jugador. Entonces el jugador actual será el jugador del índice y luego emitiré el movimiento, no, voy a encontrar el turno. Entonces, el nuevo turno será, si el jugador actual tiene el personaje x, ¿entonces qué será el siguiente turno? Lo adivinamos, será o. Y si no, será x. Entonces tenemos el nuevo turno, ahora vamos a decirles a los jugadores dentro de la sala que les toca jugar. No, esto es el movimiento y cambiemos los términos. Lo siento. Entonces vamos a decir IO.to, esto emitirá a todos los jugadores dentro de esta sala. No estoy usando socket.emit. Entonces IO.to info.room.emit move. Y voy a pasar la información autorizada a esto. Entonces, ¿cuál es la información? Voy a decir que el personaje es currentplayer.character. Y también el lugar es info.place. Y el siguiente turno, el turno será el nuevo turno que acabamos de indicar. Veamos si... Bien, todo parece bien.

9. Escuchando las Reglas y Manejando los Movimientos

Short description:

Ahora, volvamos a nuestro cliente. Tenemos que escuchar las reglas y manejar los movimientos. Después de cada movimiento, verificamos si hay una victoria. Finalmente, manejamos las desconexiones de los jugadores expulsándolos de la sala y eliminándolos del array de jugadores.

Ahora, volvamos a nuestro cliente. Ahora, tenemos que escuchar las reglas. Verás, no hice nada para eso dentro del cliente. Así que, vamos a escuchar. Justo aquí, this.socket.on y remove. Estamos recibiendo alguna información. Y qué voy a hacer con esa información, tengo un método handle move que es solo una parte de la interfaz de usuario. Establece el contenido del texto en las celdas como el carácter del movimiento, y actualiza la matriz de la tabla con unos y menos unos. Y determina el turno. Entonces, si es tu turno de jugar, el registro de juego será falso y dirá que es tu turno de jugar, y después de cada movimiento, estoy verificando la victoria justo aquí para detener el juego. Entonces, en el movimiento voy a llamar a mi función handle move y necesitará un contexto debido a mi contexto, sí. Entonces, las celdas van a ser esto y voy a decir this y la información que obtuve del movimiento, del servidor y lo manejará aquí mismo. Ahora, básicamente todo está hecho, pero voy a hacer una última cosa para atar todos los cabos sueltos porque siempre tienes que escuchar eso o estarás en problemas Tal vez eso no sea correcto decirlo. Sí. No soy hablante nativo de inglés, así que perdona mi francés. Entonces, estoy atascado en el on disconnect. Vamos a verificar si el jugador se ha desconectado de la red. Entonces, primero vamos a encontrar a los jugadores. Tengo el código justo aquí. Después de encontrar al jugador, lo voy a expulsar de la sala. Entonces, vamos a decir, players index.room. Así que, expulsémoslos de esta sala. Y también, los voy a eliminar del array de jugadores, porque si el array de jugadores se vuelve demasiado grande, consumirá mucha memoria y eso realmente no es lo que quieres. Entonces, players.splice, desde este índice y uno por uno. Bien, todo está hecho. Y realmente espero no tener ningún error ni nada. Así que, vamos a verificar.

10. Conclusión del Juego y Consejos

Short description:

Tengo dos clientes, uno creando una sala con el token 7983, y el otro uniéndose. Juego el juego y gano y pierdo al mismo tiempo. WebSocket es confiable para la transmisión de datos de extremo a extremo, pero UDP es más rápido y mejor para juegos PVP. Considera el mejor protocolo para tu juego. Además del método cliente-servidor, puedes usar una red peer-to-peer para una transmisión de datos más rápida y una codificación más sencilla.

Y vamos a ejecutar el servidor. Entonces, node server.js. Está en ejecución. Así que, déjame copiar esto. Y tengo mis pestañas listas porque soy una persona muy preparada. Así que, tengo dos pestañas, dos clientes. Y uno de ellos va a crear una sala. Entonces, el token es 7983. Y me estoy uniendo desde el otro cliente.

Muy bien. Es mi turno de jugar. El lado izquierdo es para jugar. Voy a poner una X allí y una O aquí. Y luego voy a X allí, O aquí. Correcto. Y gano y pierdo al mismo tiempo. Así que, el juego ha terminado. Y fue muy fácil. Sé que el juego es fácil, pero el concepto es realmente fácil. Piénsalo. Pero antes de terminar, volvamos a nuestras diapositivas. Tengo una cosa más que decir. Y terminaré después de eso. Así que, hay algunos tips. En primer lugar, WebSocket se basa en el protocolo TCP, que es una comunicación de 3 vías, y es muy confiable, y asegura la transmisión de datos de extremo a extremo y su seguridad. Pero también existe el protocolo UDP, que es en realidad más común y más adecuado para juegos PVP. Y es más rápido. Y si hay algunos paquetes de datos que se pierden en el camino, no le importa. Así que tal vez necesites usar eso. Así que piénsalo. ¿Cuál es lo mejor, el mejor protocolo para usar en un juego? Y también, utilicé el método cliente-servidor, aquí en el juego de Tic Tac Toe, pero no es el único método. Puedes usar el método de red peer-to-peer, donde los nodos están conectados entre sí directamente, y no hay un nodo de servidor, por lo que la transmisión de datos es más rápida entre ellos.

11. Fiabilidad y Consideraciones de Red

Short description:

WebSocket es confiable para la transmisión de datos de extremo a extremo, pero UDP es más rápido y mejor para juegos PVP. Considera el mejor protocolo para tu juego. Además del método cliente-servidor, puedes usar una red peer-to-peer para una transmisión de datos más rápida y una codificación más sencilla.

Y es mucho más sencillo de codificar. Pero es realmente poco confiable, porque, no realmente poco confiable, pero de alguna manera es poco confiable porque no hay autorización del servidor para los mensajes que se están enviando. Por lo tanto, los clientes pueden enviar lo que quieran. Y el cliente-servidor, por otro lado, en primer lugar, es muy modular, por lo que es una mejor práctica, como sabemos. Y también, toma un poco más de tiempo que p2p, porque en el escenario básico del juego de tic-tac-toe, solo hay dos jugadores, por lo que un mensaje se envía dos veces. Así que uno lo envía al servidor, y el servidor lo envía al jugador dos. Por lo tanto, lleva un poco más de tiempo. Y también, sí, creo que eso es todo. Tal vez haya algunas cosas más, no puedo recordar.

12. Consideraciones de Código de Red y Disponibilidad de Código

Short description:

Comienza temprano con tu código de red y piensa en ello desde el principio en tu código. Ten en cuenta la cantidad de información que estás transmitiendo entre tus pares. Gracias por escuchar. Websockets son la mejor opción para juegos multijugador. Es útil tener una opción no obligatoria para comprender el uso de las API de red en tiempo real. El código está disponible en GitHub.

Lo siguiente es comenzar temprano con tu código de red. Así que no digas que voy a terminar mi juego por completo y luego voy a agregar mi lógica de red para hacerlo multijugador. Será mucho más difícil y mucho más complejo. Así que piensa en ello desde el principio en tu código y hazlo simultáneamente. Y también, ten en cuenta la cantidad de información que estás transmitiendo entre tus pares, porque si la cantidad de información es muy grande, ralentizará tu servidor y no ralentizará, pero el mensaje llegará más lento y no creará una buena experiencia para los jugadores. Ahora, espero que hayas disfrutado esta charla y gracias por escuchar. Nos vemos el resto de la tarde. Hasta luego por ahora. ¿Quieres ver los resultados de esta encuesta? Parece que... Sí, claro. Me encantaría hacerlo. Websockets son la mejor opción aquí. Eso es realmente bueno porque si ya conoces Websockets, ya has recorrido más de la mitad del camino. Comienza a desarrollar juegos multijugador. Creo que fue útil tener una opción no obligatoria aquí porque eso fue algo... Tuvimos una encuesta similar ayer. No pudimos decir. Creo que había otra opción y no pudimos decir si la gente estaba usando otras tecnologías o si no estaban haciendo juegos multijugador. Siento que esto ayuda. Quería saber si la gente no ha estado trabajando con ninguna de estas API de red en tiempo real o tal vez sí lo han hecho. Es bueno saberlo. Ya has recorrido la mitad del camino. Sí. Genial. Creo que podemos echar un vistazo a algunas de las preguntas que han enviado. La primera también es una pregunta que tengo. ¿Está disponible en algún lugar el código que mostraste en la disponible en algún lugar como GitHub o algo así si quisiera probarlo y jugar con él? Sí, absolutamente. Publicaré el enlace a GitHub en el canal. Genial. Tal vez también puedas tuitearlo.

QnA

Ventajas de los juegos web y JavaScript

Short description:

¿Podemos usar UDP en juegos web? No, no es seguro debido a problemas de red. WebRTC es una alternativa, pero se recomienda TCP con WebSocket. WebRTC podría funcionar para juegos pequeños, pero las salas más grandes y los juegos móviles presentan desafíos. Para juegos uno a uno, WebRTC puede ser una buena opción. Sin embargo, aún se necesita un servidor para la conexión inicial entre pares. El uso de JavaScript en la web tiene ventajas debido a la facilidad de implementación, compilación rápida, fácil visibilidad del código y compatibilidad entre dispositivos.

Por supuesto que sí. También para aquellos que no estén en Discord y quieran verlo. Genial. Excelente. Y luego otra pregunta. No sé mucho al respecto, pero la haré. ¿Podemos, es posible usar UDP en juegos web hoy en día? ¿Es algo que podemos hacer?

En realidad, no, porque hay algunos problemas de red, como ataques VDOS que hacen que no sea seguro usar el protocolo UDP en la web, pero lo más cercano que tenemos a eso es usar WebRTC, que en realidad no es mi preferencia porque es realmente... en primer lugar, es un P2P por sí mismo y es más difícil de implementar. Así que creo que usar TCP con WebSocket es el camino a seguir.

Tiene sentido. Pero, ¿eso significa que WebRTC sería mejor en términos de... No necesariamente tendría costos de servidor. Entonces, si estás haciendo un juego pequeño o algo así, porque es P2P, no... Sí, un juego pequeño, como una sala pequeña como el juego de tres en raya, podría hacerse con WebRTC, pero a medida que las salas se vuelven más grandes, especialmente, hay más problemas para P2P y WebRTC. Por ejemplo, en juegos móviles, cada cliente tiene que enviar sus mensajes a cien personas y eso usaría mucha data de conexión y no sería una buena práctica. Tiene sentido. Pero parece que si es un juego uno a uno como el ajedrez o algo similar donde solo hay dos jugadores, entonces tal vez WebRTC sería una buena opción. Eso sería bueno. Genial. Oh, hice una pregunta de seguimiento para eso. Pero aunque sea P2P, ¿aún necesitas un servidor para hacer la conexión inicial entre los pares?

Exactamente. Puedes usar ICE en tu servidor para hacer eso. Como dije, es más difícil de implementar. Entonces, tal vez para un juego más pequeño, es mejor usar los web sockets, porque es más fácil de implementar. Tiene sentido. Genial. ¿Y qué hay de, tenemos una pregunta de Tanta. Dicen gracias por la charla. Y mi pregunta es, ¿cuál es la ventaja de usar JavaScript en la web en comparación con los juegos de escritorio, por ejemplo?

Bueno, JavaScript en la web, en realidad es mucho más fácil de implementar, porque la mayoría de los desarrolladores ya han trabajado con JavaScript y la compilación es realmente rápida, así que no necesitas nada, lo mejor de todo es que solo tienes que actualizar la página del navegador y puedes ver tu trabajo, sí, está ahí, y supongo que eso es lo mejor para mí, porque puedo compilar fácilmente mi código, ver fácilmente los resultados y cosas así, y es mucho más fácil de publicar debido a la forma en que está en la web y puedes hacerlo,

Usando JavaScript para juegos web y móviles

Short description:

JavaScript se puede utilizar para juegos web y también para crear juegos para Android e iOS. Los desarrolladores de Android pueden publicar juegos web en la tienda de aplicaciones de Android utilizando TWAs, que son similares a las PWAs. Proporciona más accesibilidad. iOS puede tener una opción similar. Esto es similar a lo que Will mencionó sobre publicar juegos de Play Games con Cordova o frameworks similares.

tus jugadores pueden jugarlo en cualquier dispositivo. Creo que hay muchas ventajas de usar JavaScript para web, pero estas son algunas de ellas. Bueno, ¿qué pasa si estuvieras haciendo, digamos, un juego para Android o iOS, ¿aún lo harías con JavaScript y luego lo publicarías de esa manera? En realidad, sí, puedes hacer eso. Soy desarrollador de Android y publico mis juegos web en la tienda de aplicaciones de Android, como tenemos esta cosa llamada TWAs en Android. Es una actividad en la que puedes tener tu navegador web y verificarlo, y sería como una PWA pero se publicaría en la tienda de juegos y sería más accesible y no estoy seguro acerca de iOS, pero creo que también puedes hacer algo similar con eso. Sí, eso tiene mucho sentido, y es algo similar a lo que Will acaba de mencionar en la charla anterior, publicar tus juegos de Play Games con Cordova o algo similar. Sí, exactamente. Eso es muy genial. ¿Y qué tal si hablas un poco sobre cómo manejas si hay un retraso, un retraso del servidor en una arquitectura cliente-servidorarchitecture? Claro. En realidad, hay muchas cosas que puedes hacer para asegurarte de que no haya muchos retrasos. En primer lugar, mantén todas las operaciones que consumen mucho tiempo fuera de tu servidor de sockets, porque crearía muchos retrasos y sería muy lento, y los mensajes no serían lo suficientemente rápidos para los clientes. Además, hay algo llamado predicción del lado del cliente y reconciliación del lado del servidor, que deberías investigar, porque enviarías un movimiento desde el cliente. Es para servidores alternativos. Y antes de que el servidor responda, haces el movimiento, en realidad, pero mantienes el movimiento que hiciste, la solicitud que hiciste desde el cliente, el código, como, me muevo un píxel hacia la derecha, y es la solicitud número uno, por ejemplo. Y el servidor lo registraría, y en el momento en que el servidor responda, sí, estás listo para continuar. Mantendrías eso y harías el siguiente, así que es otra solicitud, como, solicitud número dos, me muevo otro píxel hacia la derecha, y cuando el servidor regrese con la autorización, puedes confirmar y reconciliar, como los retrasos y cosas así. Así que es algo interesante para leer. Muchas gracias. Muy interesante. ¿Tenemos tiempo para otra pregunta? Creo que se nos acabó el tiempo. Muchas gracias Sahar. Fue genial tenerte aquí. Fue genial ver tu flujo de trabajo y tu proceso, y sí, definitivamente estaremos pendientes de un enlace al código, para poder jugar con eso. Muchas gracias.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

JS GameDev Summit 2022JS GameDev Summit 2022
33 min
Building Fun Experiments with WebXR & Babylon.js
Top Content
During this session, we’ll see a couple of demos of what you can do using WebXR, with Babylon.js. From VR audio experiments, to casual gaming in VR on an arcade machine up to more serious usage to create new ways of collaboration using either AR or VR, you should have a pretty good understanding of what you can do today.
Check the article as well to see the full content including code samples: article. 
React Summit 2023React Summit 2023
32 min
How Not to Build a Video Game
In this talk we'll delve into the art of creating something meaningful and fulfilling. Through the lens of my own journey of rediscovering my passion for coding and building a video game from the ground up with JavaScript and React, we will explore the trade-offs between easy solutions and fast performance. You will gain valuable insights into rapid prototyping, test infrastructure, and a range of CSS tricks that can be applied to both game development and your day-to-day work.

Workshops on related topic

JSNation 2023JSNation 2023
116 min
Make a Game With PlayCanvas in 2 Hours
Featured WorkshopFree
In this workshop, we’ll build a game using the PlayCanvas WebGL engine from start to finish. From development to publishing, we’ll cover the most crucial features such as scripting, UI creation and much more.
Table of the content:- Introduction- Intro to PlayCanvas- What we will be building- Adding a character model and animation- Making the character move with scripts- 'Fake' running- Adding obstacles- Detecting collisions- Adding a score counter- Game over and restarting- Wrap up!- Questions
Workshop levelFamiliarity with game engines and game development aspects is recommended, but not required.
JS GameDev Summit 2022JS GameDev Summit 2022
121 min
PlayCanvas End-to-End : the quick version
Top Content
WorkshopFree
In this workshop, we’ll build a complete game using the PlayCanvas engine while learning the best practices for project management. From development to publishing, we’ll cover the most crucial features such as asset management, scripting, audio, debugging, and much more.
JS GameDev Summit 2022JS GameDev Summit 2022
86 min
Introduction to WebXR with Babylon.js
Workshop
In this workshop, we'll introduce you to the core concepts of building Mixed Reality experiences with WebXR and Balon.js.
You'll learn the following:- How to add 3D mesh objects and buttons to a scene- How to use procedural textures- How to add actions to objects- How to take advantage of the default Cross Reality (XR) experience- How to add physics to a scene
For the first project in this workshop, you'll create an interactive Mixed Reality experience that'll display basketball player stats to fans and coaches. For the second project in this workshop, you'll create a voice activated WebXR app using Balon.js and Azure Speech-to-Text. You'll then deploy the web app using Static Website Hosting provided Azure Blob Storage.