Menu
CoddyTech

Points d’ancrage

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

Un score dessiné en (10, 10) commence au bord gauche. Pour le placer plutôt au bord droit, il te faut sa largeur, qui varie avec la valeur du nombre. Un Rect fait les calculs pour toi.

text.get_rect() accepte des arguments nommés pour chacun de ses points : center, topleft, topright, midtop, midbottom et d’autres. Le Rect est placé de façon à ce que le point se trouve là où tu l’indiques :

score_rect = score_text.get_rect(topright=(470, 10))
screen.blit(score_text, score_rect)

Maintenant, le bord droit du score reste à 470, qu’il affiche 0 ou 1000.

Un texte sur un arrière-plan chargé est plus facile à lire sur une plaque. inflate(12, 8) renvoie une copie du Rect, 12 pixels plus large et 8 pixels plus haute, avec le même centre. Dessine-la d’abord, puis le texte par-dessus :

pygame.draw.rect(screen, PLATE, score_rect.inflate(12, 8))

Le bord droit de la plaque dépasse le texte de 6 pixels, à 476, et son bord supérieur est 4 pixels plus haut, à 6.

challenge icon

Défi

Moyen
  1. Ajoute PLATE = (60, 60, 90).
  2. Place le score avec topright=(470, 10) et dessine un rectangle PLATE derrière : son Rect agrandi de (12, 8).
  3. Dans le menu, dessine un rectangle PLATE derrière Meteor Dodge : le Rect du titre, centré en (240, 140), agrandi de (24, 12).

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("assets/fonts/pixel.ttf", 24)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)
WHITE = (240, 240, 240)


def reset():
    global player, rock, score
    player = pygame.Rect(220, 300, 40, 40)
    rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
    score = 0


def draw_menu():
    screen.fill((30, 30, 46))
    title = big_font.render("Meteor Dodge", True, WHITE)
    screen.blit(title, title.get_rect(center=(240, 140)))
    hint = font.render("Press Enter to play", True, WHITE)
    screen.blit(hint, hint.get_rect(center=(240, 200)))


def draw_game():
    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, WHITE)
    screen.blit(score_text, (10, 10))


def play_frame():
    global score, state
    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"
    draw_game()


def draw_over():
    draw_game()
    message = big_font.render("Game over", True, WHITE)
    screen.blit(message, message.get_rect(center=(240, 160)))
    hint = font.render("Press R to play again", True, WHITE)
    screen.blit(hint, hint.get_rect(center=(240, 200)))


reset()
state = "menu"

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN and state == "menu":
                state = "play"
            elif event.key == pygame.K_r and state == "over":
                reset()
                state = "play"

    if state == "menu":
        draw_menu()
    elif state == "play":
        play_frame()
    else:
        draw_over()
    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