high_impact: portar un motor de juegos en JavaScript a C
Resumen
- high_impact es un pequeño motor de juegos para juegos de acción 2D, escrito en C y compilable para Windows, Mac, Linux y la web mediante WASM
- Está inspirado en Impact, un motor de juegos en JavaScript de 2010, y se ofrece bajo licencia MIT
- Código fuente: GitHub
Historia antigua
- En abril de 2010, Steve Jobs anunció mediante una carta abierta titulada "Thoughts on Flash" que iOS no daría soporte a Flash
- Flash era un plugin de navegador muy importante en la web, y muchos sitios dependían de juegos y animaciones en Flash
- Android sí soportaba Flash, pero su rendimiento no era bueno, y la decisión de Apple fue una señal del fin de Flash
- Para demostrar que era posible crear juegos web sin Flash usando la API Canvas2D de JavaScript, se desarrolló Biolab Disaster
¿Por qué C?
- C es un lenguaje simple pero profundo, adecuado para el desarrollo de juegos
- Al portar a C un decodificador MPEG1 en JavaScript, implementar VR y desarrollar formatos de imagen y audio, volvió a descubrir su gusto por C
- Reescribir Impact en C sería un ejercicio divertido
Concepto
- high_impact está implementado con la mínima cantidad de código y ofrece carga de tile maps, creación de objetos de juego, actualización y dibujo
- Maneja física y detección de colisiones, e incluye animación simple con sprite sheets, dibujo de texto, efectos de sonido y reproducción de música
- high_impact es un framework, no una librería, por lo que el usuario debe escribir la lógica de negocio
- Puede compilarse usando backends de plataforma SDL o Sokol
Entidades
- Todas las entidades comparten la misma estructura
entity_t y tienen propiedades como posición, velocidad y tamaño
- Mediante macros es posible extender la estructura base de entidad
- Cada tipo de entidad debe proporcionar un
entity_vtab_t con punteros a función
- Puede manejar hasta 64k entidades activas
Detección y respuesta de colisiones
- Calcula las colisiones con el tile map para encontrar el punto exacto de colisión
- Las colisiones entre entidades se manejan por separado, y cada entidad define cómo colisionará con otras entidades
Renderizado
- Ofrece OpenGL y un renderizador por software
- Todo el renderizado se realiza mediante una sola llamada de función, combinando texturas con un texture atlas
Sonido
- Usa SDL2 o Sokol para manejar la salida de sonido
- Puede cargar un número fijo de fuentes y reproducir un número fijo de sonidos
- Los sonidos se descartan automáticamente para poder reutilizarlos
Gestión de memoria
- Administra la memoria usando un "hunk", que es un único arreglo de bytes
- Asigna memoria con un bump allocator y un temp allocator
- La liberación de memoria se maneja automáticamente, así que el usuario no necesita preocuparse por ella
Editor de niveles
- Incluye "Weltmeister", el editor de niveles original de Impact
- Está escrito en JavaScript y fue actualizado para usar funciones modernas del navegador
- Usa la API del sistema de archivos para cargar y guardar archivos
Juego de demostración
- Se portaron a C dos juegos, Biolab Disaster y Drop, para validar las capacidades de high_impact
Extensibilidad
- high_impact es un motor de juegos tradicional, y el código específico de cada juego se escribe aparte
- La plataforma y el renderizador pueden ampliarse para soportar otros sistemas
Resumen de GN⁺
- high_impact es un motor de juegos 2D escrito en C que ofrece funciones simples pero potentes
- Es el sucesor del motor de juegos en JavaScript Impact y puede ejecutarse en varias plataformas
- Implementa de forma sencilla funciones clave para el desarrollo de juegos, como gestión de memoria y detección de colisiones
- Ofrece casos de uso reales mediante un editor de niveles y juegos de demostración
- En comparación con motores grandes como Unity o Unreal, es adecuado para proyectos más ligeros y simples
1 comentarios
Comentarios en Hacker News
Muchos juegos web fueron creados con el motor de juegos Impact, y sirvió de base para títulos comerciales multiplataforma como Cross Code, Eliot Quest y XType Plus
"Thoughts on Flash" podría haber salvado la plataforma web
El juego se ve muy pulido
high_impact no es una "librería", sino un "framework"
Me alegra haber iniciado sesión en mi cuenta de HN después de mucho tiempo y haber redescubierto Biolab Disaster
Me impresionó que se usara una UNION para crear una estructura de datos de entidades polimórficas
Si combinas el formato de archivo sin pérdida QOI con 7Zip, el rendimiento es mejor que con PNG sin pérdida
Tal vez sea para respetar la duración de la batería del jugador
Idea divertida, código abierto para maximizar el valor de aprendizaje, ejecución perfecta y una redacción clara sin vanidad: es una gran contribución
Como una de las 3000 personas con licencia, me da gusto ver el resurgimiento de Impact
Parece un excelente motor de juegos