Menu
CoddyTech

Font dari File

Termasuk bagian Aturan Game dalam perjalanan Pygame di Coddy. Pelajaran 6 dari 29.

pygame.font.Font(None, 32) menggunakan font bawaan pygame. Font ini mudah dibaca, tetapi setiap game pygame yang menggunakannya terlihat sama. File font membuat huruf dalam gamemu tampil berbeda.

Paket aset memiliki empat font di assets/fonts/. Masukkan path file sebagai pengganti None:

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

Angka tersebut adalah ukuran dalam piksel. Satu object Font memiliki satu ukuran, jadi judul dan skor dengan ukuran berbeda memerlukan dua object. Buat keduanya sekali, sebelum perulangan: memuat font akan membaca file, dan proses ini terlalu lambat jika dilakukan setiap frame.

Path dihitung relatif terhadap folder tempat main.py berada. Path yang salah akan menghentikan program dengan FileNotFoundError, yang menyebutkan nama file yang dicari.

Setiap font menggambar sesuai ukurannya sendiri: pixel.ttf pada ukuran 24 tingginya kira-kira sama dengan font bawaan pada ukuran 32, jadi bandingkan secara visual dan sesuaikan ukurannya.

challenge icon

Tantangan

Mudah
  1. Atur font agar menggunakan file assets/fonts/pixel.ttf dengan ukuran 24.
  2. Tambahkan big_font menggunakan file yang sama dengan ukuran 48.
  3. Gambar Meteor Dodge dan Game over dengan big_font.

Coba sendiri

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()

Semua pelajaran di Aturan Game

Latihan sendiri: Playground Pygame