Aller au contenu

Les menus en Pygame

Pour un jeu, il est souvent crucial d'expliquer ce qu’il se passe, ce qui passe le plus souvent par des interfaces en dehors du gameplay même.

Dans ce chapitre, on va voir comment ajouter :

  • une interface lisible (HUD)
  • des menus simples
  • de la progression (score, sauvegarde)

Afficher du texte

Pour afficher du texte, on utilise le module font.

font = pygame.font.Font(None, 36)

Puis on crée une surface de texte :

text = font.render("Score : 10", True, (255, 255, 255))

Et on l’affiche :

screen.blit(text, (20, 20))

HUD : afficher des infos pendant le jeu

Un HUD (Head-Up Display) affiche des informations utiles pendant la partie.

Exemples :

  • score
  • vies
  • temps
  • niveau actuel

Exemple simple :

score_text = font.render(f"Score : {score}", True, (255, 255, 255))
screen.blit(score_text, (20, 20))

On peut créer un menu très simple avec un état de jeu :

state = "menu"

Dans la boucle :

if state == "menu":
    screen.fill((20, 20, 20))
    title = font.render("MON JEU", True, (255, 255, 255))
    screen.blit(title, (300, 200))

Et écouter une touche pour commencer :

if keys[pygame.K_SPACE]:
    state = "playing"

Boutons très basiques

Un bouton peut être juste :

  • un rectangle
  • du texte
  • un clic souris
button_rect = pygame.Rect(300, 300, 200, 50)
pygame.draw.rect(screen, (100, 100, 100), button_rect)

Détecter un clic :

if event.type == pygame.MOUSEBUTTONDOWN:
    if button_rect.collidepoint(event.pos):
        print("Bouton cliqué")

Progression : le score

Un score est souvent un simple nombre :

score = 0

Par exemple :

  • +1 par seconde
  • +10 par ennemi
  • +100 par niveau

Sauvegarder des données

Pour sauvegarder un score, on peut utiliser un fichier texte ou JSON.

Exemple avec JSON :

import json

data = {"best_score": 42}

with open("save.json", "w") as f:
    json.dump(data, f)

Et pour le relire :

with open("save.json", "r") as f:
    data = json.load(f)

best_score = data["best_score"]

Attention à bien traiter le cas où le fichier n'existe pas encore !


Exemple : score + menu + sauvegarde

Structure typique :

if state == "menu":
    # afficher menu
elif state == "playing":
    # jeu + score
elif state == "game_over":
    # afficher score final
    # sauvegarder si record

Quizz

text = font.render("Hello", True, (255, 255, 255))
screen.blit(text, (0, 0))
À quoi sert la variable `text` ?
- À stocker une chaîne de caractères
- *À stocker une surface contenant le texte à afficher
- À définir la police
- À gérer les événements clavier
> `font.render` crée une surface graphique, pas une simple string.

Exercice pratique

Améliorez votre jeu pour :

  1. Afficher un score à l’écran
  2. Ajouter un menu de départ
  3. Ajouter un écran de fin
  4. Sauvegarder le meilleur score
  5. Réafficher le record dans le menu

Bonus :

  • Ajouter un bouton cliquable
  • Changer la couleur d’un bouton au survol

En résumé

Vous savez maintenant :

  • Afficher du texte avec pygame.font
  • Créer un HUD simple
  • Implémenter un menu avec des états
  • Créer des boutons basiques
  • Sauvegarder des données simples
  • Donner un sentiment de progression au joueur

À partir de là, vos jeux ne sont plus juste des démos techniques, mais de vrais jeux jouables.