Session 6 : Platformer

Dans cette session, tu construis un micro-platformer. Ton personnage a de la gravité, peut sauter et ramasse des étoiles sur les plateformes. Pour la première fois, tu utilises pygame directement, sans pgzrun, et tu ajoutes des effets sonores avec pygame.mixer.

Ce que tu vas apprendre aujourd’hui

  • Simuler la gravité avec une variable vel_y
  • Sauter en rendant vel_y négatif
  • Détecter les collisions avec les plateformes grâce à pygame.Rect
  • Ramasser des items (collision avec les étoiles)
  • Jouer des sons avec pygame.mixer

Étape 0 : Installation

  1. Ouvre Thonny.
  2. Télécharge le starter via ce lien, décompresse le ZIP et ouvre main.py dans Thonny.
  3. Clique sur le bouton vert Run. Tu vois une fenêtre avec un personnage, des plateformes et des étoiles, mais le personnage ne tombe pas encore.
  4. Des problèmes ? Demande à un coach.

Étape 1 : La gravité

Dans un platformer, le personnage tombe en continu vers le bas, sauf s’il se trouve sur une plateforme. On simule ça avec vel_y : une vitesse verticale qui augmente à chaque frame à cause de la gravité.

Cherche le commentaire # STAP 1 dans main.py et remplace le pass par :

# Appliquer la gravité
vel_y += GRAVITY
player_rect.y += vel_y

# Vérifie si le personnage est sur une plateforme
on_ground = False
for platform in platforms:
    if (player_rect.colliderect(platform) and vel_y > 0):
        player_rect.bottom = platform.top
        vel_y = 0
        on_ground = True

GRAVITY = 0.5 est déjà en haut du fichier. Clique sur Run. Le personnage tombe maintenant sur la plateforme la plus proche et y reste.

Que se passe-t-il ici ? À chaque frame, vel_y augmente un peu (le personnage accélère vers le bas). Si le personnage touche une plateforme en tombant (vel_y > 0), tu places son bas (bottom) pile sur le haut de la plateforme et tu arrêtes la chute (vel_y = 0).

Étape 2 : ✅ Basic : sauter

Un platformer sans saut, c’est à moitié fini. Appuie sur ESPACE pour sauter : ce n’est rien d’autre que rendre vel_y soudainement négatif.

Cherche le commentaire # STAP 2 et ajoute :

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    player_rect.x -= SPEED
if keys[pygame.K_RIGHT]:
    player_rect.x += SPEED

# Sauter — seulement si tu es au sol
if keys[pygame.K_SPACE] and on_ground:
    vel_y = -12

Clique sur Run et teste :

  • Flèches : bouge à gauche/droite
  • ESPACE : saute

Astuce : si le saut te semble trop haut ou trop bas, remplace -12 par -10 (saut plus bas) ou -15 (saut plus haut).

Étape 3 : ⭐ Stretch : ramasser les étoiles

Ajoutons quelque chose à ramasser. Le starter a déjà une liste stars avec des objets pygame.Rect. C’est toi qui écris la détection de collision.

Cherche le commentaire # STAP 3 :

for star in stars[:]:  # [:] pour pouvoir supprimer sans risque pendant la boucle
    if player_rect.colliderect(star):
        stars.remove(star)
        score += 1

Et dans la fonction de dessin (cherche # TEKEN STERREN) :

for star in stars:
    pygame.draw.polygon(screen, YELLOW, star_points(star.centerx, star.centery, 12, 5))

star_points() est déjà défini dans le starter. Il calcule les points d’une étoile à 5 branches.

En haut du jeu, il y a score = 0. Dessine le score à l’écran (cherche # TEKEN SCORE) :

score_surf = font.render(f"Étoiles : {score}", True, WHITE)
screen.blit(score_surf, (10, 10))

Étape 4 : 🔥 Expert : son et écran de victoire

Maintenant, tu ajoutes un son de saut et un écran de victoire quand toutes les étoiles sont ramassées.

Charger le son (c’est déjà prêt dans le starter ; vérifie que jump.wav se trouve dans le dossier sounds/) :

pygame.mixer.init()
jump_snd = pygame.mixer.Sound("sounds/jump.wav")

Jouer le son au saut : ajoute ceci au code du saut :

if keys[pygame.K_SPACE] and on_ground:
    vel_y = -12
    jump_snd.play()

Écran de victoire : ajoute ceci après la boucle des étoiles :

if len(stars) == 0:
    win_surf = font.render("Gagné ! Toutes les étoiles ramassées !", True, YELLOW)
    screen.blit(win_surf, (WIDTH // 2 - win_surf.get_width() // 2, HEIGHT // 2))
    pygame.display.flip()
    pygame.time.wait(3000)
    running = False

Showcase

Montre ton jeu à un coach et à un buddy. Tu arrives à ramasser toutes les étoiles avant la fin du temps ?

Dojo Defender

Le snapshot Dojo Defender d’aujourd’hui continue sur la session 5 :

  • Fond étoilé en parallaxe — trois couches d’étoiles avec leur propre vitesse
  • Particle effects — gaz d’échappement, débris d’explosion, étincelles
  • Astéroïdes destructibles — big → med → small → disparu

Télécharge le starter Dojo Defender ou la solution.

À la prochaine !

« La prochaine fois : clique sur les bugs et ZAPPE-les, avec tes propres classes. »

À emporter chez toi

Essaie une de ces extensions à la maison :

  1. Facile : change la couleur du personnage quand il est en l’air.
  2. Moyen : ajoute un timer. Le personnage a 30 secondes pour ramasser toutes les étoiles.
  3. Difficile : ajoute un ennemi qui marche d’un bout à l’autre d’une plateforme ; si le personnage le touche, le jeu redémarre.
  4. Très difficile : fais faire un double saut au personnage (deux fois ESPACE pour un deuxième saut en l’air).

Bloqué ? Demande au dojo suivant à un coach, ou essaie simplement autre chose. Programmer, c’est faire.

Regarde le cheatsheet de cette session