5 puntos por GN⁺ 2024-08-05 | 1 comentarios | Compartir por WhatsApp

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

 
GN⁺ 2024-08-05
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

    • Cross Code es un gran juego, y fue impresionante que usara tecnologías web
    • Creo que este motor probablemente contribuyó a que rindiera bien en el hardware de Nintendo Switch
  • "Thoughts on Flash" podría haber salvado la plataforma web

    • Debió de haber frustración por el hecho de que Adobe abandonara el soporte para la plataforma MacOS
    • La versión para Mac siempre estuvo por detrás de la versión para Windows
    • Jobs pudo haber pensado que Adobe no existiría sin Apple
  • El juego se ve muy pulido

  • high_impact no es una "librería", sino un "framework"

    • La lógica de negocio tiene que escribirse dentro del framework
    • A los frameworks se les solía describir de forma negativa como "librerías" que no se llevan bien con otras cosas
    • Da gusto escuchar una descripción positiva
  • 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

    • Todavía me encanta el lenguaje C; fue el primer lenguaje que aprendí
    • C es un lenguaje conciso, pero se puede profundizar mucho en él
    • El juego da vibras de Commander Keen, y siempre me gustó esa franquicia
  • 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

    • Se siente como un privilegio siquiera ver algo así
  • Como una de las 3000 personas con licencia, me da gusto ver el resurgimiento de Impact

    • Me pregunto si combina bien con Zig
  • Parece un excelente motor de juegos

    • Me pregunto por qué en el artículo se menciona que está casi al final de su vida útil
    • Me pregunto si hay motores nuevos mejores