Menu
CoddyTech

Eine Schriftart aus einer Datei

Teil des Abschnitts Spielregeln der Pygame-Journey von Coddy. Lektion 6 von 29.

pygame.font.Font(None, 32) verwendet die integrierte Schriftart von pygame. Sie ist gut lesbar, aber jedes pygame-Spiel, das sie verwendet, sieht gleich aus. Mit einer Schriftdatei bekommt dein Spiel seine eigenen Buchstaben.

Das Asset-Paket enthält vier Schriftarten in assets/fonts/. Übergib den Pfad zur Datei statt None:

font = pygame.font.Font("assets/fonts/pixel.ttf", 24)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)

Die Zahl gibt die Größe in Pixeln an. Ein Font-Objekt hat eine feste Größe. Wenn Titel und Punktestand unterschiedlich groß sein sollen, brauchst du also zwei Objekte. Erstelle sie einmal vor der Schleife: Beim Laden einer Schriftart wird die Datei gelesen, und das ist zu langsam, um es in jedem Frame zu tun.

Der Pfad ist relativ zum Ordner von main.py. Bei einem falschen Pfad wird das Programm mit FileNotFoundError angehalten und nennt dabei die gesuchte Datei.

Jede Schriftart gibt ihre eigene Größe vor: pixel.ttf in Größe 24 ist ungefähr so hoch wie die integrierte Schriftart in Größe 32. Vergleiche also nach Augenmaß und passe die Größe an.

challenge icon

Aufgabe

Einfach
  1. Setze font auf die Datei assets/fonts/pixel.ttf mit Größe 24.
  2. Füge big_font hinzu, dieselbe Datei mit Größe 48.
  3. Zeichne Meteor Dodge und Game over mit big_font.

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(None, 32)
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 = 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 = 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()

Alle Lektionen in Spielregeln

Übe selbstständig: Pygame-Playground