Presentación en HN: Liberé el código abierto de mi motor de juegos
(github.com/moddio)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 degame-sample.jsonagame.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.jsonpara usarlo en una instalación local. - Cambia el nombre del JSON exportado a
game.jsony 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
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
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
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
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
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
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ñoEn 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
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
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
U+3400~U+4DBFyU+4E00~U+9FFFEsa 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
Aquí, “empezar un blog” significa crear un motor de blog nuevo completamente desde cero
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?
Tampoco parece que el backend vaya a estar haciendo tareas de física pesadas para el frontend
En pruebas simples, rindió mucho mejor que otras librerías populares de WebSocket que se degradaban rápido
Por eso Node se siente como una buena elección
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?
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
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
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