Présentation
Jumping Joe est un jeu mobile Android de type arcade/platformer. Le joueur contrôle Joe, un petit personnage turquoise avec une casquette, qui doit sauter entre des plateformes corail alternant gauche et droite pour grimper le plus haut possible.
Le jeu est entièrement développé sans moteur de jeu, en utilisant directement l’API Canvas d’Android et un thread de rendu personnalisé ciblant 60 FPS.
Captures d’écran
Modes de jeu
Mode Classique
Gameplay illimité. Le score augmente à chaque plateforme atteinte. Le joueur grimpe jusqu’à ce qu’il tombe dans le vide. Le meilleur score est sauvegardé.
Mode Chrono
Durée limitée à 60 secondes. Il faut grimper le plus haut possible avant la fin du temps. Le timer s’affiche en haut de l’écran et devient rouge sous les 10 dernières secondes.
Mécaniques de jeu
Contrôles
- Moitié gauche de l’écran : sauter à gauche
- Moitié droite de l’écran : sauter à droite
- Impossible de sauter en plein vol (une seule impulsion par plateforme)
Plateformes
- Positionnées en alternance gauche (15% de l’écran) et droite (85%)
- 30% de chance d’apparaître des deux côtés simultanément
- Espacement vertical de 100px entre chaque niveau
- 30+ niveaux pré-générés, puis génération dynamique continue
- Les niveaux hors écran sont supprimés pour optimiser la mémoire (minimum 20 actifs)
Physique du moteur
| Paramètre | Valeur |
|---|---|
| Gravité | 0.45 px/frame² |
| Vélocité de saut (vertical) | -12 px/frame |
| Vélocité de saut (horizontal) | 9 px/frame |
| Seuil de caméra | 40% de la hauteur d’écran |
| Taille du personnage | 55 x 55 px |
| Taille des plateformes | 130 x 25 px |
| Zone de collision d’atterrissage | 20px au-dessus de la plateforme |
| Marge de mort | 50px sous l’écran |
Système de caméra
La caméra suit verticalement le joueur quand il dépasse 40% de la hauteur de l’écran depuis le haut. Les plateformes défilent vers le bas tandis que le joueur reste à la position seuil. Les niveaux sortis de l’écran (>50px en dessous) sont supprimés et de nouveaux sont générés au-dessus.
Rendu graphique
Tout est dessiné en code avec l’API Canvas :
- Joe : corps turquoise (RGB 0, 160, 150), casquette marron avec bande bleue, yeux blancs avec pupilles
- Plateformes : corail/saumon (RGB 231, 100, 100) avec ombre portée gris foncé décalée de 6px
- Fond : vert pâle (RGB 230, 238, 225)
- UI : barre de score orange, étoile et diamant comme icônes, bouton pause
- Game Over : overlay semi-transparent, popup bleu avec score en jaune-vert
Architecture technique
jumping-joe/
├── MainActivity.kt # Point d'entrée, initialise GameView
├── GameView.kt # Logique de jeu complète
│ # - Rendu Canvas de tous les éléments
│ # - Gestion des inputs tactiles
│ # - Physique et collisions
│ # - Machine à états (Menu/Playing/GameOver)
│ # - Système de caméra
├── GameThread.kt # Boucle de rendu dédiée
│ # - Cible 60 FPS (16.67ms/frame)
│ # - Canvas lock/unlock thread-safe
│ # - Gestion du cycle de vie
└── model/
├── Player.kt # Personnage Joe
│ # - Position, vélocité, direction
│ # - Dessin proportionnel (casquette, yeux)
│ # - Logique de saut et d'atterrissage
└── Platform.kt # Plateformes et niveaux
# - PlatformLevel (1-2 plateformes/niveau)
# - Génération alternée gauche/droite
# - Dessin avec ombres portées
Boucle de jeu
Boucle (60x par seconde) :
1. UPDATE : gravité → vélocité → position → collisions → caméra
2. DRAW : fond → plateformes → joueur → UI (score, timer)
3. SLEEP : attente adaptative pour maintenir 16.67ms/frame
Détection de collision
- Le joueur doit être en phase de chute (vy > 0)
- Vérification verticale : le bas du joueur touche le haut de la plateforme (±20px)
- Vérification horizontale : chevauchement entre le joueur et la plateforme
- Si collision : vélocités remises à zéro, joueur centré sur la plateforme
Technologies utilisées
| Technologie | Utilisation |
|---|---|
| Kotlin | Langage principal |
| Canvas API | Rendu 2D personnalisé (formes, texte, couleurs) |
| SurfaceView | Surface d’affichage avec accélération matérielle |
| Thread | Boucle de rendu dédiée à 60 FPS |
| Paint | Anti-aliasing pour des graphismes fluides |
| MotionEvent | Gestion des entrées tactiles |
Aucune dépendance externe en dehors d’AndroidX. Le jeu est entièrement auto-suffisant.
Ce que j’ai appris
- Fondamentaux du développement de jeux vidéo (game loop, états, physique)
- Simulation physique : gravité, vélocité, accélération, trajectoire parabolique
- Rendu 2D temps réel avec Canvas et gestion du multi-threading
- Détection de collisions par boîtes englobantes (AABB)
- Génération procédurale de niveaux et gestion dynamique de la mémoire
- Dessin de personnages et d’éléments visuels entièrement en code