2 Modes de jeu
60 FPS Rendu
0 Dépendances externes
Android 7+ Compatibilité

Télécharger l’APK Code source

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

  1. Le joueur doit être en phase de chute (vy > 0)
  2. Vérification verticale : le bas du joueur touche le haut de la plateforme (±20px)
  3. Vérification horizontale : chevauchement entre le joueur et la plateforme
  4. 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