Menu
CoddyTech

Punkty zakotwiczenia

Część sekcji Zasady gry ścieżki Pygame w Coddy. Lekcja 7 z 29.

Wynik narysowany w punkcie (10, 10) zaczyna się przy lewej krawędzi. Aby zamiast tego umieścić go przy prawej krawędzi, potrzebujesz znać jego szerokość, która zmienia się wraz ze wzrostem liczby. Obiekt Rect obliczy to za Ciebie.

text.get_rect() przyjmuje argumenty nazwane określające dowolny z punktów: center, topleft, topright, midtop, midbottom i inne. Rect jest umieszczany tak, aby wskazany punkt znalazł się tam, gdzie określisz:

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

Teraz prawa krawędź wyniku pozostaje na 470, niezależnie od tego, czy wyświetla 0, czy 1000.

Tekst na zatłoczonym tle łatwiej odczytać, gdy znajduje się na płytce. inflate(12, 8) zwraca kopię Rect, szerszą o 12 pikseli i wyższą o 8, z tym samym środkiem. Najpierw narysuj płytkę, a potem tekst na niej:

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

Prawa krawędź płytki znajduje się 6 pikseli za tekstem, na 476, a jej górna krawędź jest 4 piksele wyżej, na 6.

challenge icon

Wyzwanie

Średni
  1. Dodaj PLATE = (60, 60, 90).
  2. Umieść wynik w pozycji topright=(470, 10) i narysuj za nim prostokąt PLATE: jego Rect powiększony o (12, 8).
  3. W menu narysuj prostokąt PLATE za Meteor Dodge: Rect tytułu, wyśrodkowany w punkcie (240, 140), powiększony o (24, 12).

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Zasady gry

Poćwicz samodzielnie: Edytor online Pygame