Core, una nueva tecnología experimental para crear videojuegos
(github.com/damn)-
¿Qué es coreCore?
- coreCore es una forma experimental de crear videojuegos en formato de herramienta y motor para juegos Action-RPG, además de un editor de propiedades
- Usa un sistema simple de componentes, y los componentes son vectores de Clojure con la forma
[keyword value] - Las distintas entidades están compuestas por mapas de Clojure
- Los efectos secundarios dentro del juego se manejan con componentes como
[:tx/foo param], similares a la estructura de Datomic - Todo el estado del juego se almacena en un solo atom llamado
app/state, y las entidades también existen como atoms dentro del atom principal - Todo el contenido de la aplicación se guarda en
resources/properties.edn, se valida usando esquemas de Malli y puede editarse desde una GUI
-
Capturas de pantalla
-
Cómo empezar a desarrollar
- Ingresa el siguiente comando:
lein dev
- La aplicación se inicia y también realiza las siguientes tareas:
- Inicia el servidor NREPL
- Al cerrar la aplicación (ESC en el menú principal),
clojure.tools.namespacerecarga los archivos modificados y reinicia la app - Si ocurre un error, no hace falta reiniciar la JVM; basta con corregirlo y llamar a
dev-loop/restart! - En VIM, puedes vincular la tecla F5 al siguiente comando:
nmap <F5> :Eval (do (in-ns 'dev-loop)(restart!))
- Ingresa el siguiente comando:
-
Licencia del código
- Se ofrece bajo la licencia MIT
-
Licencia de los assets
- Los assets usados son propietarios y no son de código abierto
- Tileset: https://winlu.itch.io/
- Criaturas, íconos de ítems y habilidades, FX y otros assets: https://www.oryxdesignlab.com
- Cursor: Leonid Deburger https://deburger.itch.io/
- Los assets usados son propietarios y no son de código abierto
Resumen de GN⁺
- coreCore es una herramienta para crear fácilmente juegos Action-RPG y usa un sistema simple de componentes para gestionar el estado del juego
- Almacena todo el estado del juego en un solo atom y permite editar propiedades mediante una GUI, lo que resulta útil para desarrolladores
- Se ofrece bajo licencia MIT, pero los assets utilizados son propietarios
- Herramientas con funciones similares incluyen RPG Maker y Unity
1 comentarios
Opiniones en Hacker News
Genial. Nunca he lanzado un juego, pero siempre me gusta ver enfoques distintos para el desarrollo de juegos.
Hasta ahora, Bevy me ha parecido bueno al principio, pero con muchos problemas de implementación y propenso a volverse desordenado; Unity, con su enfoque de gameobjects y componentes composables, ha sido lo más práctico: el motor no estorba y es más fácil evitar el spaghetti.
Godot no me gustó. Una mala jerarquía orientada a objetos, un lenguaje integrado flojo, y las “signals”, que supuestamente reducen el spaghetti, terminaron aumentándolo. Pygame es bastante bueno para proyectos pequeños, y sobre una base procedimental puedes montar tus propias capas orientadas a objetos o funcionales.
No conozco Clojure, pero me parece interesante que hayan intentado una implementación funcional en un campo que típicamente parece encajar bien con la orientación a objetos.
Las signals de Godot son un gran avance frente a la falta de modularidad de las clases integradas de Unity. Godot y Unity tienen básicamente el mismo modelo de scene/node/component, pero creo que Godot lo hace mejor.
Las ventajas de Unity son su renderer 3D, PhysX integrado, el backend il2cpp para C#, el profiler, el rendimiento general de ejecución y el soporte para consolas. En cambio, el diseño de Godot es más cohesivo, mientras que Unity se siente como si desde alrededor de 2018 se hubiera fragmentado en 10 direcciones.
Hoy trabajo más en C++ embebido, así que no uso mucho orientación a objetos, pero aprendí a programar con C# y estoy bastante acostumbrado a la herencia.
Donde Unity lleva ventaja es en los niveles “Triple I” y “Double A”, porque tiene mejores funciones 3D/de rendimiento, herramientas y add-ons. Para proyectos AAA, ninguno de los dos es la mejor opción.
En juegos 2D y 3D simples ya no veo razón para usar Unity; creo que Godot lo irá superando poco a poco y la cuota de Unity seguirá bajando.
Lo más frustrante son los nodos y esas cosas que uno no sabe si son bugs del editor o features; da mucho la sensación de que al principio fue hecho para proyectos “pequeños”.
Por eso casi no uso el editor salvo para componer scenes y configurar una jerarquía aproximada. Mis herramientas habituales son Emacs+C# LSP, VS Code para depurar, y el editor de Godot para ajustar el scene tree.
Básicamente es Python con semántica de slot/emit e integrado con el editor, así que más bien está bien. Prefiero que esté dentro del lenguaje antes que integrarlo mediante un sistema de build, metadatos y archivos de configuración externos complejos.
Dicen que pueden simplificar el desarrollo de juegos, pero luego lanzan un montón de jerga como Clojure vectors, datomics, atoms, transactions y malli schemas. ¿Alguien puede explicarlo?
Representa los elementos del juego y sus propiedades como estructuras de datos simples, y guarda todo el estado del juego en un único contenedor (app/state) para facilitar su gestión y actualización.
Además, ofrece una GUI para editar el contenido del juego almacenado en un único archivo (resources/properties.edn), de modo que sea más accesible para no programadores, y busca validar los datos con schemas de Malli para mantener la consistencia del contenido y reducir errores.
Un Clojure vector es básicamente algo parecido a una lista. Un atom es una referencia mutable que apunta a una estructura de datos inmutable; se puede ver como un puntero con una semántica de actualización específica.
Una transaction es similar a una transacción de base de datos: cambia varias estructuras de datos al mismo tiempo, pero solo hace commit si todas las operaciones tienen éxito; si fallan, hace rollback o reintenta.
Un Malli schema es una forma de hacer verificación de tipos en un lenguaje de tipado dinámico, y Datomic es una implementación de base de datos no SQL basada en estructuras de datos inmutables: en lugar de sobrescribir cambios de forma destructiva, solo agrega datos, lo que permite volver a cualquier punto del pasado.
Creo que la mejor forma de aprender ese modelo es ver la charla “Are we there yet” de Rich Hickey, el creador de Clojure.
[1 2 3].Yo la uso para construir efectos secundarios como
[:tx/foo 3], y a eso lo llamo transaction, de forma parecida a Datomic. Aquí:tx/fooes una keyword que identifica de forma única el comportamiento de un componente.Sinceramente, creo que este proyecto fracasó en la práctica. Es un desorden sobrediseñado y no tiene una estructura clara.
El mayor problema es que no hay ninguna especificación. No hicieron una historia para el juego, o quizá pensaron que un juego no necesita historia. Así que simplemente se divirtieron programando en Clojure y se pusieron a codear como locos.
Está bien que hayan intentado algo interesante, y es un área que le interesa a mucha gente.
Como desarrollador de juegos, este GitHub me parece ridículo. Es casi una parodia de la autoabsorción académica que los desarrolladores de juegos odian. Las capturas feas son la cereza del pastel.
Se me ocurren varios juegos que salieron de esta extraña autoabsorción académica. También está Jonathan Blow, mencionado en el comentario hermano, y en cuanto vi este proyecto pensé en Braid.
La generación procedural también antes era un tema de torre de marfil, y todos los avances en gráficos 3D empezaron al principio como papers completamente poco realistas salidos de conferencias. Muchas cosas que hoy son mainstream en los juegos alguna vez fueron ideas académicas de nicho.
Falla en el paso básico de comunicar qué hace.
Si por aburrimiento no habrías hecho nada, entonces sales ganando. Es parecido a la lógica de Jonathan Blow usando Jai en el desarrollo indie.
Me sorprende que haya generado tanta conversación aun con tan poca documentación en el repositorio. Viendo el código, parece más un proyecto que un motor de juegos.
El property editor es interesante, pero creo que este post recibe votos más por el título que por el contenido.
Está bueno. Me alegra ver a otro desarrollador que hace desarrollo de juegos con Clojure, como yo. A veces uno se complica la vida a propósito :)
Ahora estoy desarrollando un shooter TPS multijugador 3D en Clojure. Si les interesa, la demo está aquí: https://prototype-game.pages.dev
Pronto también voy a publicar un artículo de blog sobre el recorrido de desarrollo.
Me gusta Clojure, pero ¿no es una elección algo rara para desarrollar videojuegos usar un lenguaje funcional con estructuras de datos inmutables?
Estos son algunos de mis textos favoritos sobre desarrollo de juegos funcional:
https://prog21.dadgum.com/228.html
https://prog21.dadgum.com/23.html
https://prog21.dadgum.com/24.html
https://prog21.dadgum.com/25.html
https://prog21.dadgum.com/26.html
Para lo demás, con Lisp se puede hacer casi cualquier cosa. Gracias a la forma en que Clojure maneja las estructuras de datos inmutables y a su excelente sistema de protocols (https://www.freshcodeit.com/blog/clojure-protocols-and-the-e...), pude dividir fácilmente todo el juego en componentes separados.
Clojure tiene más potencial de rendimiento que Ruby o Python, y ambos se han usado realmente en juegos indie comerciales.
Es natural que los estudios eviten riesgos y prefieran estrategias conocidas, como la orientación a objetos o usar ECS para grandes cantidades de entidades.
Personalmente creo que la programación funcional podría encajar bien, pero primero hay que encontrar una arquitectura que resuelva problemas reales del desarrollo de juegos. Hay que empezar con experimentos pequeños, y las game jams son perfectas para eso.
Ya existe una plataforma comercial de creación de juegos llamada Core, que funciona sobre Unreal Engine 4.
https://en.wikipedia.org/wiki/Core_(video_game)
Creo que eligieron mal el nombre. Ya se usa en este ámbito: https://www.coregames.com/create
Sería interesante analizar datos sobre “tiempo/complejidad invertidos en el motor de juego” frente a “complejidad/interés del juego resultante”.
Como desarrollador de juegos, esperaría que el rendimiento de nuevos juegos surgidos de sistemas simples de plantillas/motores fuera una curva logarítmica con rendimientos decrecientes.
En otras palabras, cuanto mejor haces la máquina de cortar galletas, menos variedad tienen las galletas.