Paku.io est un jeu multijoueur en temps réel inspiré par Agar.io. Les joueurs contrôlent des cellules qui grandissent en consommant de la nourriture et d'autres joueurs dans une carte de 11000 par 11000 pixels.
sequenceDiagram
participant Client
participant Serveur
Client->>+Serveur: Connexion WebSocket
Serveur->>Serveur: Initialisation de la carte et de la nourriture
Serveur->>Serveur: Création des bots
Serveur->>-Client: État initial du jeu (joueurs, nourriture, carte)
Client->>+Serveur: setUsername(nom)
Serveur->>Serveur: Affectation du nom au joueur
Serveur->>-Client: Mise à jour de l'état du jeu
Note over Client,Serveur: Début de la partie
sequenceDiagram
participant Client
participant Serveur
loop Chaque frame
Client->>+Serveur: playerMove(position)
Serveur->>Serveur: Mise à jour de la position du joueur
Serveur->>Serveur: Détection des collisions
alt Collision avec de la nourriture
Serveur->>Serveur: handleFoodCollision()
Serveur->>Serveur: Création d'animation de consommation
end
alt Collision avec un autre joueur
Serveur->>Serveur: handlePlayerCollision()
Serveur->>Serveur: Le plus grand mange le plus petit
end
Serveur->>-Client: Mise à jour du gameState
end
sequenceDiagram
participant Client
participant Serveur
Client->>+Serveur: playerSplit() (touche Espace)
Serveur->>Serveur: Diviser la cellule du joueur
Serveur->>-Client: Mise à jour du gameState
Client->>+Serveur: playerEjectMass() (touche W)
Serveur->>Serveur: Éjection de masse
Serveur->>-Client: Mise à jour du gameState
Client->>+Serveur: login/register
Serveur->>Serveur: Authentification/Création du compte
Serveur->>-Client: Résultat + statistiques du joueur
Client->>+Serveur: gameOver
Serveur->>Serveur: Sauvegarde des statistiques
Serveur->>-Client: Accusé de réception
sequenceDiagram
participant Serveur
participant Bots
participant Animations
participant Clients
loop À intervalle régulier
Serveur->>Bots: updateSpecificBots()
Bots->>Bots: makeDecision()
Bots->>Serveur: Déplacement et actions
Serveur->>Animations: updateAnimations()
Animations->>Animations: Mise à jour des positions et progressions
Serveur->>Clients: Diffusion du gameState mis à jour
end
Note over Serveur,Clients: Mise à jour en temps réel
Problème : La synchronisation précise entre les clients et le serveur était complexe, avec des risques de décalages et d'incohérences dans l'état du jeu.
Solution : Nous avons implémenté un système d'état de jeu centralisé sur le serveur qui fait autorité. Toutes les collisions et mises à jour de position sont calculées côté serveur puis propagées aux clients. Nous utilisons des intervalles de mise à jour optimisés (33ms pour les animations, 16ms pour les bots) pour garantir une expérience fluide.
Problème : Détecter et gérer efficacement les collisions entre joueurs, nourriture et masses éjectées sans impact sur les performances.
Solution : Nous avons développé un système de détection de collisions optimisé basé sur le calcul du pourcentage de chevauchement entre les cellules, avec des seuils configurables (OVERLAP_THRESHOLD). Le CollisionService traite séparément les différents types de collisions (nourriture, joueurs, masses éjectées) pour maintenir le code organisé.
Problème : Créer des animations fluides pour la consommation de nourriture et l'absorption de joueurs sans surcharger le réseau ou le client.
Solution : Nous avons créé un AnimationService dédié qui gère les transitions côté serveur. Les animations sont envoyées aux clients avec des informations de début/fin qui permettent des interpolations fluides. Cela limite le trafic réseau tout en maintenant une expérience visuelle satisfaisante.
Problème : Développer des bots qui offrent un challenge intéressant sans être trop prévisibles ou trop puissants.
Solution : Notre BotService implémente un système de personnalités pour chaque bot avec différents niveaux d'agressivité, de focus sur la nourriture et de mouvement. Les bots analysent leur environnement pour prendre des décisions contextuelles, comme chasser des joueurs plus petits ou rechercher de la nourriture.
- Système de niveaux et progression : Implémenter un système d'XP et de niveaux pour les joueurs enregistrés
- Skins et personnalisation : Ajouter des options de personnalisation débloquables avec l'expérience
- Cartes thématiques : Développer différentes variantes de cartes avec des mécaniques uniques
- Classements mondiaux : Créer un tableau de classement persistant des meilleurs joueurs
- Modes de jeu alternatifs : Ajouter des modes comme le battle royale ou le jeu en équipes
- Adaptation mobile complète : Optimiser l'expérience pour les appareils tactiles
- Notifications en jeu : Améliorer les retours visuels pour les actions importantes (kill, niveau, accomplissements)
Nous sommes particulièrement fiers de l'architecture modulaire de notre jeu. La séparation claire entre les services (AnimationService, BotService, CollisionService, etc.) permet une maintenance facile et des évolutions indépendantes de chaque module. Cette approche orientée services nous a permis de développer en parallèle et d'intégrer progressivement de nouvelles fonctionnalités sans compromettre la stabilité du jeu.
Notre système de bots avec des personnalités uniques représente un accomplissement significatif. Chaque bot possède son propre profil de comportement qui influence ses décisions de jeu, rendant l'expérience contre les adversaires IA plus variée et moins prévisible. L'algorithme de recherche de clusters de nourriture démontre particulièrement bien cette intelligence artificielle contextuelle.
Malgré la complexité des interactions en temps réel, nous avons réussi à créer une expérience utilisateur fluide avec des animations élégantes et des transitions naturelles. Le système d'authentification, le profil joueur et l'interface de jeu forment un ensemble cohérent et intuitif qui invite à l'engagement. L'attention portée aux détails visuels, comme les animations de consommation des cellules, contribue à la satisfaction globale du gameplay.
L'équilibre entre croissance, vitesse et stratégie crée une dynamique de jeu captivante. Les mécanismes comme la division de cellules, l'éjection de masse et les fusions temporisées offrent une profondeur stratégique qui récompense l'expérience et l'habileté du joueur tout en restant accessibles aux nouveaux venus. Cet équilibre délicat entre accessibilité et profondeur représente l'un des aspects dont nous sommes le plus fiers.