Créer une interface utilisateur dans vos jeux avec Pygame

Introduction

L'interface utilisateur (UI) est un élément essentiel dans les jeux vidéo. Elle permet de rendre les interactions avec le joueur plus intuitives, via des boutons, des menus, ou encore l'affichage de scores et de messages à l'écran. En Pygame, bien qu'il n'existe pas de système d'interface intégré aussi développé que dans d'autres moteurs de jeu, il est tout à fait possible de créer une interface utilisateur fonctionnelle en gérant manuellement les éléments graphiques et les événements utilisateur.

Dans cet article, nous allons voir :

  1. Comment créer des boutons et des menus dans Pygame.
  2. Afficher des scores et des messages à l'écran.
  3. Gérer les événements utilisateur via une interface graphique.

1. Créer des boutons et des menus avec Pygame

Créer des boutons et des menus est un excellent moyen d'ajouter une interface interactive à vos jeux. Un bouton est généralement un rectangle que l'on dessine à l'écran, et qui réagit aux clics de la souris.

Créer un bouton simple

Pour créer un bouton, il faut :

  1. Dessiner un rectangle à l'écran.
  2. Détecter un clic de souris sur ce rectangle.

Voici un exemple de code qui crée un bouton et détecte un clic :

import pygame

# Initialiser Pygame
pygame.init()

# Créer la fenêtre
screen = pygame.display.set_mode((800, 600))

# Définir les couleurs
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
DARK_BLUE = (0, 0, 200)

# Définir la position et la taille du bouton
button_rect = pygame.Rect(300, 250, 200, 80)

# Police pour le texte
font = pygame.font.Font(None, 36)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

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

    # Remplir l'écran avec du blanc
    screen.fill(WHITE)

    # Dessiner le bouton
    pygame.draw.rect(screen, BLUE, button_rect)

    # Ajouter du texte sur le bouton
    text = font.render("Jouer", True, WHITE)
    screen.blit(text, (button_rect.x + 50, button_rect.y + 25))

    # Mettre à jour l'affichage
    pygame.display.flip()

pygame.quit()

Explication :

  • pygame.draw.rect() : Dessine un rectangle qui sert de bouton.
  • button_rect.collidepoint(event.pos) : Vérifie si la position de la souris au moment du clic se trouve à l'intérieur du rectangle représentant le bouton.
  • pygame.font.Font() : Utilisé pour afficher du texte (comme "Jouer") sur le bouton.

Avec ce code, un clic sur le bouton affichera "Bouton cliqué !" dans la console.

Créer un menu avec plusieurs boutons

Un menu est simplement un groupe de boutons disposés de manière organisée. Vous pouvez gérer plusieurs boutons en les stockant dans une liste et en vérifiant les clics pour chacun d'entre eux. Voici un exemple de menu simple avec trois boutons :

buttons = [
    pygame.Rect(300, 200, 200, 80),  # Bouton "Jouer"
    pygame.Rect(300, 300, 200, 80),  # Bouton "Options"
    pygame.Rect(300, 400, 200, 80),  # Bouton "Quitter"
]

button_texts = ["Jouer", "Options", "Quitter"]

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            for i, button in enumerate(buttons):
                if button.collidepoint(event.pos):
                    print(f"Bouton '{button_texts[i]}' cliqué !")

    screen.fill(WHITE)

    for i, button in enumerate(buttons):
        pygame.draw.rect(screen, BLUE, button)
        text = font.render(button_texts[i], True, WHITE)
        screen.blit(text, (button.x + 50, button.y + 25))

    pygame.display.flip()

2. Afficher des scores et des messages à l'écran

L'affichage de scores ou de messages est une fonctionnalité essentielle pour informer les joueurs de leur progression ou pour afficher des informations importantes pendant le jeu.

Afficher un score à l'écran

Pour afficher un score ou un texte, Pygame utilise des polices pour rendre le texte sous forme d'image, qui peut ensuite être affichée à l'écran à l'aide de la fonction blit().

Voici comment afficher un score dynamique dans le coin supérieur gauche de l'écran :

# Initialiser la police
font = pygame.font.Font(None, 36)

# Initialiser le score
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Mettre à jour le score
    score += 1

    # Effacer l'écran
    screen.fill(WHITE)

    # Afficher le score
    score_text = font.render(f"Score: {score}", True, (0, 0, 0))
    screen.blit(score_text, (10, 10))

    pygame.display.flip()
    pygame.time.delay(100)  # Juste pour ralentir un peu la mise à jour du score

pygame.quit()

Afficher un message à l'écran

Vous pouvez également afficher des messages d'information ou des notifications (comme "Game Over" ou "Victoire") de manière similaire. Voici comment afficher un message Game Over centré à l'écran :

message = "Game Over"

# Calculer la position pour centrer le texte
text = font.render(message, True, (255, 0, 0))
text_rect = text.get_rect(center=(400, 300))

screen.blit(text, text_rect)
pygame.display.flip()

3. Gestion des événements utilisateur via une interface graphique

Les événements utilisateur dans un jeu peuvent être capturés via l'interface graphique en détectant les interactions avec les boutons, les menus et autres éléments interactifs. Nous avons déjà vu comment capturer les clics de souris, mais vous pouvez aussi gérer d'autres types d'interactions, comme le clavier ou même des glissements sur des interfaces tactiles.

Exemple de gestion de la souris et du clavier via l'UI

Voici un exemple simple qui combine la détection de clics de souris et appuis sur les touches :

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        # Gestion des événements de la souris
        if event.type == pygame.MOUSEBUTTONDOWN:
            if button_rect.collidepoint(event.pos):
                print("Bouton cliqué avec la souris")

        # Gestion des événements du clavier
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                print("Touche Espace pressée")

    screen.fill(WHITE)
    pygame.draw.rect(screen, BLUE, button_rect)
    pygame.display.flip()

Utilisation avancée : glisser-déposer

Pour les interfaces interactives plus complexes, vous pouvez également gérer des actions comme le glisser-déposer d'objets (drag and drop). Voici un exemple où un rectangle peut être déplacé par un clic et glissement de la souris :

dragging = False
rect = pygame.Rect(200, 200, 100, 50)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            if rect.collidepoint(event.pos):
                dragging = True
                offset_x = rect.x - event.pos[0]
                offset_y = rect.y - event.pos[1]
        if event.type == pygame.MOUSEBUTTONUP:
            dragging = False
        if event.type == pygame.MOUSEMOTION:
            if dragging:
                rect.x = event.pos[0] + offset_x
                rect.y = event.pos[1] + offset_y

    screen.fill(WHITE)
    pygame.draw.rect(screen, BLUE, rect)
    pygame.display.flip()

Conclusion

La création d'une interface utilisateur avec Pygame est une étape importante dans le développement de jeux vidéo. Bien que Pygame n'ait pas de système UI intégré aussi complet que d'autres moteurs, il est possible de créer des interfaces interactives personnalisées grâce aux boutons, menus, et la gestion des événements utilisateur. En combinant ces éléments avec l'affichage de scores et de messages à l'écran, vous pouvez offrir une meilleure expérience aux joueurs.

Ces bases vous permettent de développer des interfaces plus avancées et de rendre vos jeux plus intuitifs et agréables à jouer.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *