5 points par GN⁺ 2024-08-05 | 1 commentaires | Partager sur WhatsApp

high_impact : porter un moteur de jeu JavaScript en C

Résumé

  • high_impact est un petit moteur de jeu pour jeux d’action 2D, écrit en C, compilable pour Windows, Mac, Linux et le web via WASM
  • Inspiré d’Impact, un moteur de jeu JavaScript de 2010, il est proposé sous licence MIT
  • Code source : GitHub

Histoire ancienne

  • En avril 2010, Steve Jobs a annoncé dans une lettre ouverte intitulée "Thoughts on Flash" qu’iOS ne prendrait pas en charge Flash
  • Flash était alors un plugin de navigateur extrêmement important sur le web, et de nombreux sites dépendaient des jeux et animations Flash
  • Android prenait en charge Flash, mais avec des performances médiocres, et la décision d’Apple a marqué le début de la fin pour Flash
  • Biolab Disaster a été développé pour prouver qu’il était possible de créer des jeux web sans Flash en utilisant l’API JavaScript Canvas2D

Pourquoi le C ?

  • Le C est un langage à la fois simple et profond, bien adapté au développement de jeux
  • Après avoir porté un décodeur JavaScript MPEG1 en C, travaillé sur une implémentation VR, et développé des formats d’image et audio, l’auteur a redécouvert son attachement au C
  • Réécrire Impact en C serait un exercice amusant

Concept

  • high_impact est implémenté avec un minimum de code et fournit le chargement de tile maps, la création d’objets de jeu, ainsi que les fonctions de mise à jour et de rendu
  • Il gère la physique et la détection de collisions, et inclut des animations simples à partir de sprite sheets, l’affichage de texte, les effets sonores et la lecture musicale
  • high_impact est un framework plutôt qu’une bibliothèque, et l’utilisateur doit écrire sa propre logique métier
  • Il peut être compilé avec les backends de plateforme SDL ou Sokol

Entités

  • Toutes les entités partagent la même structure entity_t, avec des propriétés comme la position, la vitesse et la taille
  • Des macros permettent d’étendre la structure de base des entités
  • Chaque type d’entité doit fournir un entity_vtab_t contenant des pointeurs de fonction
  • Jusqu’à 64k entités actives peuvent être gérées

Détection et gestion des collisions

  • Les collisions avec la tile map sont calculées pour trouver avec précision le point d’impact exact
  • Les collisions entre entités sont traitées séparément, et chaque entité définit la manière dont elle entre en collision avec les autres

Rendu

  • Le moteur propose OpenGL ainsi qu’un moteur de rendu logiciel
  • Tout le rendu passe par un seul appel de fonction, et les textures sont regroupées à l’aide d’un atlas de textures

Son

  • La sortie audio est gérée avec SDL2 ou Sokol
  • Un nombre fixe de sources peut être chargé, et un nombre fixe de sons peut être joué
  • Les sons sont automatiquement libérés pour pouvoir être réutilisés

Gestion mémoire

  • La mémoire est gérée à l’aide d’un "hunk", c’est-à-dire un unique tableau d’octets
  • L’allocation mémoire repose sur un bump allocator et un temp allocator
  • La libération de mémoire est gérée automatiquement, de sorte que l’utilisateur n’a pas à s’en préoccuper

Éditeur de niveaux

  • Le moteur inclut "Weltmeister", l’éditeur de niveaux original d’Impact
  • Écrit en JavaScript, il a été mis à jour pour utiliser des fonctionnalités modernes du navigateur
  • Il utilise l’API du système de fichiers pour charger et enregistrer les fichiers

Jeux de démo

  • Deux jeux, Biolab Disaster et Drop, ont été portés en C afin de valider les capacités de high_impact

Extensibilité

  • high_impact est un moteur de jeu traditionnel, auquel on ajoute du code spécifique à chaque jeu
  • Les plateformes et le moteur de rendu peuvent être étendus pour prendre en charge d’autres systèmes

Le résumé de GN⁺

  • high_impact est un moteur de jeu 2D écrit en C qui offre des fonctionnalités simples mais puissantes
  • Successeur du moteur de jeu JavaScript Impact, il peut fonctionner sur diverses plateformes
  • Il implémente simplement les fonctions essentielles au développement de jeux, comme la gestion mémoire et la détection de collisions
  • Il propose des cas d’usage concrets grâce à un éditeur de niveaux et des jeux de démonstration
  • Il convient aux projets légers et simples, par rapport à de gros moteurs comme Unity ou Unreal

1 commentaires

 
GN⁺ 2024-08-05
Avis Hacker News
  • De nombreux jeux web ont été créés avec le moteur de jeu Impact, qui a servi de base à des titres commerciaux multiplateformes comme Cross Code, Eliot Quest et XType Plus

    • Cross Code est un excellent jeu, et le fait qu’il utilise des technologies web était impressionnant
    • Je pense que ce moteur a probablement contribué à ses hautes performances sur le matériel de la Nintendo Switch
  • "Thoughts on Flash" a peut-être sauvé la plateforme web

    • Il devait y avoir une certaine frustration face à l’abandon du support de la plateforme MacOS par Adobe
    • La version Mac a toujours été en retard sur la version Windows
    • Jobs pensait peut-être qu’Adobe n’existerait pas sans Apple
  • Le jeu a l’air très propre

  • high_impact n’est pas une « bibliothèque », mais un « framework »

    • Il faut écrire la logique métier à l’intérieur du framework
    • On décrivait souvent les frameworks de façon négative comme des « bibliothèques » qui ne s’intègrent pas bien avec le reste
    • Ça fait plaisir d’entendre une formulation positive
  • Je suis heureux d’avoir reconnecté mon compte HN après si longtemps et d’avoir ainsi redécouvert Biolab Disaster

  • J’ai trouvé impressionnant l’usage d’une UNION pour créer une structure de données d’entités polymorphes

    • J’aime toujours le langage C, c’était le premier que j’ai appris
    • Le C est un langage concis, mais qu’on peut approfondir
    • Le jeu rappelle Commander Keen, et j’adorais cette franchise
  • En combinant le format de fichier sans perte QOI avec 7Zip, on obtient de meilleures performances qu’avec des PNG sans perte

  • C’est peut-être pour respecter l’autonomie de la batterie des joueurs

  • Idée intéressante, open source pour une valeur d’apprentissage maximale, exécution parfaite, écriture claire sans vanité — c’est une superbe contribution

    • Rien que voir ce genre de chose donne un sentiment de privilège
  • En tant que l’un des 3000 détenteurs de licence, je suis ravi de voir Impact renaître

    • Je me demande s’il s’accorde bien avec Zig
  • Cela ressemble à un excellent moteur de jeu

    • Je me demande pourquoi l’article dit qu’il est presque en fin de vie
    • Je me demande s’il existe de nouveaux moteurs meilleurs