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.
Wyzwanie
Średni- Dodaj
PLATE = (60, 60, 90). - Umieść wynik w pozycji
topright=(470, 10)i narysuj za nim prostokątPLATE: jego Rect powiększony o (12, 8). - W menu narysuj prostokąt
PLATEzaMeteor 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()
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