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
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
"Thoughts on Flash" a peut-être sauvé la plateforme web
Le jeu a l’air très propre
high_impact n’est pas une « bibliothèque », mais un « framework »
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
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
En tant que l’un des 3000 détenteurs de licence, je suis ravi de voir Impact renaître
Cela ressemble à un excellent moteur de jeu