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.
This talk has been presented at JS GameDev Summit 2022, check out the latest edition of this JavaScript Conference.
FAQ
Se utiliza WebSocket para el desarrollo de juegos multijugador, siendo la tecnología básica para la comunicación en tiempo real entre el cliente y el servidor.
En el servidor de Sahar, se genera un token para la sala mediante un número aleatorio de cuatro dígitos.
Sahar importa un archivo index.html que contiene la plataforma Phaser y socket.io implementado, necesario para el desarrollo del juego de tic-tac-toe.
Antes de emitir un movimiento al servidor y otros jugadores, Sahar verifica si es el turno del jugador y si el espacio en el tablero está vacío.
Sahar escucha la solicitud de 'crear sala' en su servidor, genera un token de cuatro dígitos y asigna el jugador a esa sala con el token generado.
Sahar menciona que el protocolo UDP es más común y adecuado para juegos PVP debido a su rapidez, aunque tiene el inconveniente de que no asegura la llegada de todos los paquetes de datos.
Sahar Poundasseh utiliza Phaser como motor de juego y Socket.io Node.js como servidor para el desarrollo de juegos web multijugador.
No es posible usar UDP en juegos web debido a problemas de seguridad como los ataques DDoS, siendo WebRTC lo más cercano a UDP que se puede usar en la web.
JavaScript facilita la implementación, es conocido por la mayoría de los desarrolladores, permite una compilación rápida y los juegos pueden jugarse en cualquier dispositivo.
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.
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.
PlayCanvas is an open-source game engine used by game developers worldwide. Optimization is crucial for HTML5 games, focusing on load times and frame rate. Texture and mesh optimization can significantly reduce download sizes. GLTF and GLB formats offer smaller file sizes and faster parsing times. Compressing game resources and using efficient file formats can improve load times. Framerate optimization and resolution scaling are important for better performance. Managing draw calls and using batching techniques can optimize performance. Browser DevTools, such as Chrome and Firefox, are useful for debugging and profiling. Detecting device performance and optimizing based on specific devices can improve game performance. Apple is making progress with WebGPU implementation. HTML5 games can be shipped to the App Store using Cordova.
This Talk explores the use of Babylon.js and WebXR to create immersive VR and AR experiences on the web. It showcases various demos, including transforming a 2D game into a 3D and VR experience, VR music composition, AR demos, and exploring a virtual museum. The speaker emphasizes the potential of web development in the metaverse and mentions the use of WebXR in Microsoft products. The limitations of WebXR on Safari iOS are discussed, along with the simplicity and features of Babylon.js. Contact information is provided for further inquiries.
Little.js is a super lightweight and fast JavaScript game engine that has everything included to start making games right away. It has a tiny footprint and no dependencies, making it perfect for size-coding competitions like JS13K. Little.js is built with an object-oriented structure and comes with several classes. It provides a fast rendering system, a comprehensive audio system, and various starter projects for different game types. Little.js is designed to be simple and easy to understand, allowing you to look at and modify the code.
The Talk discusses ways to boost the performance of WebGL Unity games, including issues with bundle size, memory usage, and runtime performance. It suggests using Brotli for compression and non-exception support for better performance. Choosing the appropriate texture compression format and experimenting with separate builds can also help. The Talk also covers optimizing textures, models, audio, and assets by reducing build size, using compression, disabling unnecessary models, and optimizing audio quality. Unity's optimization tools and profilers are recommended for analyzing performance and memory issues.
The Talk showcases the development of a video game called Athena Crisis using web technologies like JavaScript, React, and CSS. The game is built from scratch and includes features like multiple game states, AI opponents, and map editing. It demonstrates the benefits of using CSS for game development, such as instant load times and smooth transitions. The Talk also discusses optimizing performance, supporting dark mode, and publishing the game to other platforms.
The Talk discusses the use of the canvas element in games and web applications to improve performance. It compares the Canvas API and WebGL API, highlighting the advantages and disadvantages of each. The Canvas API allows for both CPU and GPU rendering, while WebGL API only uses GPU and hardware acceleration. Using the canvas element can significantly enhance performance, but it comes with increased complexity and development costs.
En esta masterclass, construiremos un juego utilizando el motor WebGL de PlayCanvas desde el principio hasta el final. Desde el desarrollo hasta la publicación, cubriremos las características más cruciales como la escritura de scripts, la creación de UI y mucho más. Tabla de contenido:- Introducción- Introducción a PlayCanvas- Lo que vamos a construir- Agregando un modelo de personaje y animación- Haciendo que el personaje se mueva con scripts- 'Falsa' carrera- Agregando obstáculos- Detectando colisiones- Agregando un contador de puntuación- Fin del juego y reinicio- ¡Resumen!- Preguntas Nivel de la masterclassSe recomienda familiaridad con los motores de juegos y los aspectos del desarrollo de juegos, pero no es obligatorio.
En esta masterclass, construiremos un juego completo utilizando el motor PlayCanvas mientras aprendemos las mejores prácticas para la gestión de proyectos. Desde el desarrollo hasta la publicación, cubriremos las características más cruciales como la gestión de activos, scripting, audio, depuración, y mucho más.
En este masterclass, te presentaremos los conceptos básicos de la construcción de experiencias de Realidad Mixta con WebXR y Babylon.js. Aprenderás lo siguiente:- Cómo agregar objetos de malla 3D y botones a una escena- Cómo utilizar texturas procedurales- Cómo agregar acciones a objetos- Cómo aprovechar la experiencia predeterminada de Realidad Cruzada (XR)- Cómo agregar física a una escena Para el primer proyecto en este masterclass, crearás una experiencia interactiva de Realidad Mixta que mostrará estadísticas de jugadores de baloncesto a fanáticos y entrenadores. Para el segundo proyecto en este masterclass, crearás una aplicación WebXR activada por voz utilizando Babylon.js y Azure Speech-to-Text. Luego, desplegarás la aplicación web utilizando el alojamiento de sitios web estáticos proporcionado por Azure Blob Storage.
Sumérgete en el cautivador mundo del desarrollo de microjuegos con Frank Force en este interactivo masterclass de codificación en vivo. Diseñado tanto para desarrolladores experimentados como para curiosos principiantes, esta sesión explora los desafíos únicos y las alegrías de crear juegos y demos con restricciones extremas de tamaño.
Walt te mostrará 2 formas de crear rápidamente un servidor de juegos en Vultr: una con nuestra instalación de Minecraft con un solo clic en el Marketplace de Vultr, y otra a través de la Terminal después de implementar un servidor de Vultr.
Basado en gran medida en Free Association en el Metaverso - Avaer @Exokit - M3, Avaer demostrará algunas de las formas en que los estándares abiertos permiten la travesía abierta y gratuita de usuarios y activos en todo el metaverso interconectado.
Comments