Menu
CoddyTech

Un écran de menu

Fait partie de la section Règles du jeu du Journey Pygame de Coddy. Leçon 2 sur 29.

La plupart des jeux s’ouvrent sur un menu : un titre et une ligne qui indique comment démarrer. Un menu est un état de plus. Commence avec state = "menu" et affiche un écran différent tant que cet état est actif.

Pour démarrer le jeu, il suffit d’appuyer sur une touche ; récupère donc cette information dans les événements. Un événement KEYDOWN se produit une fois par pression, et event.key indique de quelle touche il s’agit :

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RETURN and state == "menu":
        state = "play"

La partie state == "menu" est importante : la touche Entrée ne démarre le jeu que dans le menu. Plus tard, appuyer sur Entrée sur un autre écran ne fait rien.

L’affichage dépend lui aussi de l’état :

screen.fill((30, 30, 46))
if state == "menu":
    # le titre et Appuyez sur Entrée pour jouer
else:
    # le joueur, le rocher, le score, fin de partie

Le code de mise à jour reste sous if state == "play":, donc rien ne bouge quand le menu est affiché.

challenge icon

Défi

Facile
  1. Commence avec state = "menu".
  2. Dans la boucle d’événements, lorsque tu appuies sur Entrée et que l’état est "menu", définis-le sur "play".
  3. Tant que l’état est "menu", dessine uniquement Meteor Dodge centré en (240, 140) et Press Enter to play centré en (240, 200) sur le fond sombre.
  4. Sinon, dessine le jeu comme avant.

Essayez vous-même

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
state = "play"

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

    if state == "play":
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= 6
        if keys[pygame.K_RIGHT]:
            player.x += 6
        player.clamp_ip(screen.get_rect())

        rock.y += 4
        if rock.top > 360:
            rock.y = -24
            rock.x = random.randint(0, 456)
            score += 1
        if rock.colliderect(player):
            state = "over"

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (255, 196, 0), player)
    pygame.draw.rect(screen, (235, 80, 80), rock)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    if state == "over":
        message = font.render("Game over", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Règles du jeu

Entraînez-vous par vous-même : Playground Pygame