Projet académique fil rouge réalisé durant mon Bachelor Full Stack. Développement d'un moteur de jeu multijoueur en temps réel, structuré selon le pattern MVC pour séparer la logique métier du rendu graphique. Ce projet démontre une capacité à concevoir des systèmes complexes et synchronisés en environnement asynchrone.
Ce projet a été structuré en 10 Travaux Pratiques (TP), simulant un cycle de production réel. La particularité résidait dans le développement découplé : le client a été entièrement conçu avant la mise à disposition du backend (TP6), imposant une modularité rigoureuse et l'utilisation de données simulées (Mocks).
Objectifs validés :
- Implémentation du pattern MVC (Modèle-Vue-Contrôleur) en JavaScript natif.
- Manipulation de Spritesheets : Découpage dynamique et animation de personnages sur Canvas.
- Communication asynchrone (Fetch API) avec un backend Uvicorn/FastAPI.
- Débuggage et optimisation d'une base de données relationnelle SQLite.
- Frontend : JavaScript Vanilla (ES6+), HTML5 Canvas, CSS3.
- Backend : Python (FastAPI), SQLite (
game.db). - Serveur : Uvicorn (ASGI server).
- Architecture : Programmation Orientée Objet (Classes
Game,Player,GameController).
Pour garantir la maintenabilité malgré l'absence initiale de serveur, le projet suit une séparation stricte des responsabilités :
- Le Modèle (
Game.js,Player.js) : Gère l'état pur du jeu (coordonnées, points de vie, inventaire) et les règles de collision. Il est totalement indépendant de l'affichage. - La Vue (
GameView.js) : Observe le Modèle et s'occupe exclusivement du rendu graphique (dessin des sprites, décors, effets visuels). - Le Contrôleur (
GameController.js) : Intercepte les entrées utilisateur (clavier/souris) et orchestre les mises à jour du Modèle en fonction des retours du serveur.
Le moteur JavaScript découpe dynamiquement les planches de sprites (Spritesheets) stockées dans les assets. Les animations (marche, repos, actions) sont synchronisées avec le cycle de rafraîchissement du jeu (Game Loop).
Interface complète de gestion de profil (dashboard.html) permettant de choisir son skin et de consulter ses statistiques, le tout relié au backend Python pour la persistance des données.
Gestion des flux de données en temps réel. Le client communique avec un serveur asynchrone performant capable de gérer les interactions simultanées de plusieurs dizaines de joueurs.
Le plus grand défi a été de coder la logique de jeu sans backend disponible durant 60% du projet.
- Solution : Grâce au MVC, j'ai pu tester toute la logique de déplacement dans le Modèle avec des données fictives. Lors de l'arrivée du backend au TP6, l'intégration a été quasi instantanée car seule la couche de données du Contrôleur a dû être adaptée.
Lors des tests en charge, le serveur Python présentait des bugs de verrouillage de base de données.
- Solution : Analyse du code
db.pyet optimisation des requêtes SQL pour assurer que les écritures de scores et de positions ne bloquent pas le serveur Uvicorn.
- Cloner le dépôt :
git clone [https://github.com/EnzoRouet/JS-Arena]- Lancer le backend :
pip install uvicorn fastapi
python main.py
# Ou via uvicorn : uvicorn main:app --reload- Lancer le client : Ouvrez portail.html via Live Server.