Ankerpunkte
Teil des Abschnitts Spielregeln der Pygame-Journey von Coddy. Lektion 7 von 29.
Eine bei (10, 10) gezeichnete Punktzahl beginnt am linken Rand. Soll sie stattdessen am rechten Rand enden, brauchst du ihre Breite, und die Breite ändert sich, wenn die Zahl wächst. Ein Rect übernimmt die Berechnungen für dich.
text.get_rect() akzeptiert Schlüsselwortargumente für jeden seiner Punkte: center, topleft, topright, midtop, midbottom und weitere. Das Rect wird so platziert, dass der angegebene Punkt dort landet, wo du es festlegst:
score_rect = score_text.get_rect(topright=(470, 10))
screen.blit(score_text, score_rect)Jetzt bleibt der rechte Rand der Punktzahl bei 470, egal ob sie 0 oder 1000 anzeigt.
Text auf einem unruhigen Hintergrund ist auf einer Platte leichter zu lesen. inflate(12, 8) gibt eine Kopie des Rect zurück, die 12 Pixel breiter und 8 Pixel höher ist und denselben Mittelpunkt hat. Zeichne zuerst die Platte und dann den Text darauf:
pygame.draw.rect(screen, PLATE, score_rect.inflate(12, 8))Der rechte Rand der Platte liegt 6 Pixel hinter dem Text, bei 476, und ihr oberer Rand liegt 4 Pixel darüber, bei 6.
Aufgabe
Mittel- Füge
PLATE = (60, 60, 90)hinzu. - Platziere die Punktzahl mit
topright=(470, 10)und zeichne einPLATE-Rechteck dahinter: sein Rect wird um (12, 8) vergrößert. - Zeichne im Menü ein
PLATE-Rechteck hinterMeteor Dodge: das Rect des Titels, zentriert bei (240, 140) und um (24, 12) vergrößert.
Probier es selbst
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()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielregeln
Übe selbstständig: Pygame-Playground