2 puntos por GN⁺ 2023-12-22 | 1 comentarios | Compartir por WhatsApp

Motor de juegos Moddio 2

  • Moddio es un motor de juegos enfocado primero en el multijugador.
  • Incluye código de red con autoridad del servidor, interpolación de snapshots y funciones de reconciliación del lado del cliente.
  • Soporta más de 50 jugadores concurrentes o más de 300 objetos en movimiento en una VM de 5 dólares al mes.

Demo

  • Incluye en la caja: motor de física Box2D, código de red con autoridad del servidor, sistema de inventario y objetos, atributos integrados (HP, energía, etc.) y tasas de regeneración, sistema de diálogo, tienda, control de unidades, proyectiles con predicción del lado del cliente y movimiento de unidades, IA de unidades y pathfinding A*, controles móviles y más.

Cómo ejecutar el juego

  • Se requiere Node 18 o superior.
  • Después de configurar el repositorio, ve al directorio /src, cambia el nombre de game-sample.json a game.json, vuelve al directorio raíz y ejecuta el servidor.
  • Ahora puedes jugar en http://localhost:80.

Cómo crear un juego nuevo desde cero

  • Los juegos de Moddio se crean y editan usando el editor de juegos Moddio disponible en https://www.modd.io.
  • Después de crear un juego, puedes exportar un game.json para usarlo en una instalación local.
  • Cambia el nombre del JSON exportado a game.json y muévelo al directorio ./src.

Cómo contribuir

  • Moddio es completamente gratuito y de código abierto bajo la licencia MIT.
  • Para saber cómo convertirte en colaborador, visita la página de contribución.

Créditos

  • Se usan el motor de juegos Isogenic, Phaser, PlanckJS, uWebsocket, Box2D, recursos de Kenney, Hero Icons y más.

Opinión de GN⁺

  • El motor de juegos Moddio está especializado en el desarrollo de juegos multijugador y ofrece funciones potentes para soportar muchos jugadores con bajo costo.
  • Es de código abierto y sigue evolucionando gracias a las contribuciones de la comunidad, por lo que también es accesible para ingenieros de software principiantes.
  • Incluye una amplia variedad de funciones necesarias para el desarrollo de juegos, lo que brinda a los desarrolladores un entorno para crear y probar prototipos rápidamente.

1 comentarios

 
GN⁺ 2023-12-22
Comentarios de Hacker News
  • En la pantalla de registro de la app de Android te piden ingresar el nombre de usuario y la contraseña de Google en algo que parece un formulario web dentro de la app, pero el usuario no tiene forma de saber si la app está espiando la contraseña
    Normalmente parece que las apps usan un flujo donde te llevan a una pantalla de inicio de sesión y luego te regresan; me pregunto si implementar ese patrón es difícil. También me pregunto si es un problema causado por el soporte multiplataforma

    • En principio no es algo muy difícil. Trabajo con fabricantes de autos y tenemos que hacer que los usuarios inicien sesión con una cuenta OEM; en teoría todo cumple con la normativa, pero en la práctica hay muchas cosas que no funcionan y corregirlas toma mucho tiempo
      Aun así, lo que se describe arriba es algo que de verdad no debería pasar, y pensé que Google ya lo había prohibido
    • A esto se le llama OAuth 2.0, y si usas algo como Okta implementarlo es sencillo
  • Hacer que los usuarios adopten un motor de juego nunca es fácil, y si además es de código cerrado, todavía menos
    Viendo la galería de juegos en el sitio, parece que hasta ahora lo han hecho bastante bien, pero me pregunto si son solo unos cuantos amigos haciendo cosas o si hay una comunidad bastante activa

    • La combinación de buenas funciones, facilidad de aprendizaje y baja barrera de entrada puede llegar bastante lejos
      Piensa en una estructura donde, con un uso casual de unos días o incluso unas horas, ya puedes obtener resultados significativos. Basta con recordar Flash
    • Hay una comunidad activa y se están creando 150~300 juegos nuevos cada día
      Sin duda ayuda que la barrera de entrada sea baja tanto para desarrolladores como para jugadores. No hace falta descargar nada ni registrarse
  • Solo por el título no imaginé que esto fuera modd.io. Es un framework/plataforma popular para crear juegos IO

    • Juego bastante y hasta he vendido alguno antes, pero nunca había escuchado ese término. ¿Qué es un juego IO?
  • Entré a un servidor de Brains y me dio curiosidad cómo sería la experiencia con unos 50 jugadores. El movimiento se sentía algo entrecortado, como cabría esperar con websockets, y como estoy haciendo algo parecido también tenía curiosidad por la compresión de red
    No estoy seguro de que la compresión con LZ-string por sí sola sea suficiente. Con 50 jugadores se usan unos 20 KB por segundo, mientras que Warzone usa solo unos 48 KB por segundo con 150 jugadores. Si no tienes datos ilimitados, el costo de ancho de banda en la nube puede subir bastante
    También me llamó la atención que el búfer de bytes comprimido se viera como 埒愑䣔橤㤰゙㟍稦獦ঙ惝䓇強栛䳌۬䌃̩佼. No sé si los resultados de compresión de LZ-string normalmente se ven así, pero se me hizo bastante extraño
    En cualquier caso, hay bastante margen de mejora en la parte de networking si quieren reducir costos potenciales. El proyecto completo es muy impresionante y está muy bien hecho

    • En nuestros websockets el movimiento se siente bastante preciso: https://gooberdash.winterpixel.io/
      La clave es la predicción del lado del cliente y un algoritmo de networking con rollback. Nuestro estado de juego es de alrededor de 1 KB a 30 Hz, así que normalmente cabe en un solo paquete; por eso websockets tampoco está tan mal. Claro, un protocolo no confiable sería mejor
    • ¿Podrías explicar un poco más la parte de “el movimiento se sentía algo entrecortado, como cabría esperar con websockets”? He jugado algunos “juegos IO” y, salvo algún jugador con mucho lag de vez en cuando, se veían bastante fluidos
      Hace unos meses estuve probando un poco WebSockets y, según entendí, usar TCP para una comunicación sensible a la latencia como la de los juegos tiene desventajas considerables. El encabezado de TCP es más del doble de grande que el de UDP, hay paquetes de control adicionales, y la transmisión de datos nuevos se retrasa mientras se retransmiten datos viejos. Como WebSockets también funciona sobre TCP, tiene las mismas desventajas
      Aun así, la gente suele decir que TCP garantiza la entrega de los mensajes de WebSocket, pero yo pude reproducir pérdida de paquetes. Al final, las desventajas siguen ahí y, si de verdad necesitas entrega garantizada, tendrías que construir algo por encima de eso; si es así, parecería que desde el inicio podrías haber hecho lo mismo sobre UDP solo para los mensajes necesarios
      Apenas he tocado networking un poco, así que tómalo en cuenta porque casi no tengo conocimientos ni experiencia en eso
    • Los caracteres CJK representan una parte muy grande de los caracteres Unicode imprimibles. [1] Los dos bloques más grandes incluyen U+3400~U+4DBF y U+4E00~U+9FFF
      Esa cadena se decodifica como \u57d2\u6111\u48d4\u6a64\u3930\u3099\u37cd\u7a26\u7366\u0999\u60dd\u44c7\u5f37\u681b\u4ccc\u06ec\u4303\u0329\u4f7c
      [1] https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
  • Una forma segura de no terminar nunca un juego es empezar por escribir un motor
    Crear tu propia tecnología es totalmente posible, pero en cada etapa esa tecnología tiene que estar adaptada a tu propio proyecto, no a una plataforma de juegos de propósito general

    • ¡Debería empezar un blog!
      Aquí, “empezar un blog” significa crear un motor de blog nuevo completamente desde cero
    • ¿Podrías explicar un poco más a qué parte de modd.io te refieres? ¿Quieres decir que es el resultado de haber intentado hacer un juego y haber fracasado?
    • Es muy probable que la mayoría de quienes usan un motor en realidad no quieran hacer juegos desde el principio, sino que en el fondo quieran crear un motor
  • He visto que los backends multijugador basados en Node.js al final se vuelven lentísimos cuando aumenta el número de conexiones. Tengo curiosidad por saber cómo resolvieron ese problema
    ¿No sería mejor una alternativa como Go en estos casos?

    • No estoy muy seguro de por qué. Del lado de las conexiones, gracias al event loop de Node, no parecería que el bloqueo de E/S en HTTP request/response fuera un problema
      Tampoco parece que el backend vaya a estar haciendo tareas de física pesadas para el frontend
    • Usamos uWebSockets(https://github.com/uNetworking/uWebSockets). Está escrito en C, pero tiene una interfaz que se puede usar desde NodeJS
      En pruebas simples, rindió mucho mejor que otras librerías populares de WebSocket que se degradaban rápido
    • En la mayoría de los juegos .io, el cuello de botella probablemente sea la E/S. El nombre del género viene del dominio de nivel superior, aunque sí parece un juego de palabras
      Por eso Node se siente como una buena elección
    • La escalabilidad sí puede ser una consideración real, especialmente cuando hay muchas conexiones. En nuestro caso, optimizamos el backend para manejar de forma eficiente una cantidad considerable de conexiones simultáneas
      Cada juego está limitado a un máximo de 64 personas, pero al probar con más de 100 conexiones no vimos problemas de rendimiento. Cada juego corre en un contenedor aislado
  • Tengo curiosidad por la motivación para crear un motor nuevo
    En el README se ve que ya trae integradas cosas bastante específicas, como sistema de armas (melee/proyectiles), tienda, predicción del lado del cliente para proyectiles y movimiento de unidades
    Me pregunto por qué metieron esas cosas dentro del motor, en vez de hacerlas plugins copiables. Claro, muchos juegos ni siquiera necesitan esas funciones; entonces, ¿esto es un motor de juegos? ¿O es un motor para un género específico como FPS/RPG/u otro?
    No es que no me guste la tecnología en sí, pero sigo con la pregunta de “¿por qué?”. ¿Para qué es? ¿Por qué usar esto en vez de Three.js y un servidor propio?

    • Gracias por la pregunta. Tomamos la decisión consciente de hacer que el motor tuviera una estructura más opinionated que otras alternativas modulares. Porque queremos desarrollar juegos multijugador 2D extremadamente rápido
      Por ejemplo, hicimos un MMORPG simple en 2 horas: https://www.youtube.com/watch?v=GZVsxkALR5U
      Creemos que hay una relación inversa entre facilidad de uso y nivel de personalización. Elegimos lo primero para cerrar la brecha entre los juegos multijugador, que son conocidos por ser difíciles de hacer, y los desarrolladores de juegos casuales
    • “¿Para qué es?”
      Probablemente no sea para ti, sino para quienes quieren hacer esos juegos específicos. No todos los motores tienen que ser de propósito general
  • Tenía algunos proyectos hobby que parecerían encajar muy bien con esto. Sé programar, pero cuando hago proyectos hobby hay momentos en los que no quiero concentrarme tanto, así que el low-code y un editor interactivo se ven bien para desarrolladores aficionados
    Personalmente, lo que más me entusiasma es la generación de mapas y mundos. Me pregunto si la mejor forma sería exportar el juego como JSON, modificarlo por programa y luego volver a importarlo
    Aunque sí se siente un poco abrumador. El mundo del tutorial, sin modificar, ya son 3500 líneas de JSON, así que hay mucho que entender
    La primera idea que se me ocurre es hacer cambios a propósito y ver cómo cambia el JSON. También tendría que buscar un buen visor de diff para JSON. Eso probablemente ayudaría a encontrar las partes que quiero tocar. Los assets y los tiles del mapa seguramente los juntaría en el editor interactivo
    Me pregunto si ese enfoque tiene sentido y si hay herramientas que ayuden

    • No recomendaría editar el JSON directamente. Es bastante difícil de leer y está inflado. En modd.io hay acciones que permiten modificar el mapa directamente
      Uno de los creadores de nuestra comunidad está generando mapas dinámicamente con ChatGPT. Está haciendo un juego de escondidas, y envía prompts para generar el JSON de mapas 2D, luego carga ese mapa cada vez que empieza una nueva ronda. Todavía no es público, así que es difícil compartir el juego
      Además, uno de los miembros de la comunidad está creando un intérprete para el JSON de nuestros juegos. Por ejemplo: https://pypi.org/project/pymodd/
  • Me alegra ver que salgan más proyectos open source como este. Me sorprende que tenga menos de 100 estrellas en GitHub

    • Espero que no se malinterprete, lo pregunto con verdadera curiosidad. ¿Por qué te sorprende que tenga menos de 100 estrellas en GitHub?
    • Tal vez porque recién lo acaban de publicar