This source code is not from me but from - daveruiz - I just adapted it to work on an Arduino Nano ESP32-S3 with an ST7920 display.
Un moteur de jeu de tir à la première personne (FPS) de style rétro, inspiré par des classiques comme Wolfenstein 3D, conçu pour tourner sur un microcontrôleur Arduino Nano ESP32-S2 avec un écran LCD ST7920.
Ce projet est une démonstration complète des capacités de la plateforme ESP32 pour le "demomaking" et le jeu rétro, incluant un moteur de rendu 3D par raycasting, une IA pour les ennemis, une gestion de la physique, des effets sonores, et un éditeur de niveau complet.
- Fonctionnalités
- Matériel Requis
- Logiciels et Dépendances
- Installation et Compilation
- Comment Jouer
- L'Éditeur de Niveau
- Structure du Code
- Crédits et Remerciements
- Moteur de Rendu 3D Raycasting : Affiche un environnement 3D fluide sur un écran monochrome 128x64.
- Textures et Sprites : Murs texturés avec effets d'ombrage et sprites pour les ennemis et les objets.
- Entités Dynamiques : Gestion des ennemis avec une IA basée sur des états (repos, alerte, attaque en mêlée, tir à distance) et des objets à collecter (clés, kits de soin).
- Portes Interactives : Portes standards et portes verrouillées nécessitant des clés pour être ouvertes.
- Système de Niveaux Multiples : Le jeu peut charger plusieurs niveaux stockés efficacement en mémoire
PROGMEM
. - Effets Sonores : Sons pour les tirs, la collecte d'objets, les pas, etc., joués sur un simple buzzer.
- Menu d'Options : Un menu pour configurer le son et inverser l'axe Y des contrôles.
- Contrôles Flexibles : Le code est structuré pour supporter un joystick analogique, une manette SNES ou des boutons poussoirs.
- Éditeur de Niveau Complet : Un outil web (HTML/JS/CSS) pour créer, modifier et exporter des cartes directement au format C++ requis par le jeu.
- Microcontrôleur : Arduino Nano ESP32-S2.
- Écran : Écran LCD ST7920 128x64 (mode SPI).
- Contrôleur (au choix) :
- Joystick Analogique (par défaut) : Type HW-504 avec bouton poussoir.
- Manette SNES (optionnel).
- Boutons poussoirs (optionnel).
- Son : Un simple buzzer piézo-électrique.
Le brochage exact est défini dans le fichier constants.h
.
- Arduino IDE (version 2.x recommandée).
- Support pour les cartes ESP32 : À installer via le gestionnaire de cartes de l'Arduino IDE.
- Bibliothèque
U8g2lib
: La bibliothèque graphique essentielle pour l'écran. Elle peut être installée via le gestionnaire de bibliothèques de l'Arduino IDE.
- Installation :
- Installez l'Arduino IDE.
- Ajoutez le support pour les cartes ESP32 dans le gestionnaire de cartes.
- Installez la bibliothèque
U8g2lib
depuis le gestionnaire de bibliothèques.
- Configuration :
- Clonez ou téléchargez ce projet.
- Ouvrez le fichier principal (
main.h
ou le.ino
correspondant) dans l'Arduino IDE. - Dans
constants.h
, choisissez votre type de contrôleur en décommentant la ligne appropriée (USE_JOYSTICK
,USE_SNES_CONTROLLER
, ouUSE_BUTTONS
).
- Branchement : Branchez le matériel en suivant les définitions de broches dans
constants.h
. - Téléversement :
- Sélectionnez "Arduino Nano ESP32" dans le menu des cartes.
- Choisissez le bon port COM.
- Cliquez sur "Téléverser".
Le jeu est configuré par défaut pour utiliser un joystick analogique.
- Stick analogique : Déplacer le joueur (avant/arrière) et le faire tourner (gauche/droite).
- Bouton du Joystick (clic) : Tirer / Interagir avec les portes / Sélectionner une option dans les menus.
- Bouton + Stick vers le bas : Afficher la carte du niveau en vue de dessus.
Un éditeur de niveau basé sur le web est fourni pour faciliter la création de cartes.
- Pour l'utiliser : Ouvrez le fichier
index.html
dans un navigateur web moderne (Chrome, Firefox). - Fonctionnalités clés :
- Interface graphique pour dessiner les niveaux.
- Palette complète avec tous les éléments du jeu.
- Fonctions de chargement/sauvegarde de cartes.
- Outils de sélection, copier et coller.
- Exportation directe : Le bouton "Sauvegarder (C++)" génère un fichier
.txt
contenant le tableauPROGMEM
à copier directement dans votre fichierlevel.h
.
Le projet est organisé en plusieurs fichiers pour plus de clarté :
main.h
: Cœur du programme, boucle principale, machine à états.constants.h
: Toutes les constantes globales, configuration des broches et du contrôleur.display.h
: Fonctions de rendu, initialisation de l'écran.entities.h
: Définition des structuresPlayer
,Entity
,Door
, etc.input.h
/.cpp
: Gestion des entrées pour les différents contrôleurs.level.h
: Stockage des données des niveaux.sound.h
: Moteur sonore simple.sprites.h
: Toutes les données des images (bitmaps).types.h
/.cpp
: Structures de base (Coords
,UID
) et fonctions associées.editor/
: Dossier contenant les fichiers de l'éditeur de niveau (index.html
,style.css
,script.js
).
- Développement : Patrick.A / ZelTroN2k3.
- Algorithme de Raycasting : Le moteur de rendu est basé sur l'excellent tutoriel de Lode Vandevenne.
- Bibliothèque Graphique : Un grand merci aux contributeurs de la bibliothèque U8g2lib.