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.
Tantangan
Mudah- Atur
fontagar menggunakan fileassets/fonts/pixel.ttfdengan ukuran 24. - Tambahkan
big_fontmenggunakan file yang sama dengan ukuran 48. - Gambar
Meteor DodgedanGame overdenganbig_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