Menu
CoddyTech

Dosyadan Bir Yazı Tipi

Coddy'nin Pygame Journey'sinin Oyun Kuralları bölümünün bir parçası. Ders 6 / 29.

pygame.font.Font(None, 32), pygame'in yerleşik yazı tipini kullanır. Okunması kolaydır, ancak bunu kullanan her pygame oyunu aynı görünür. Bir yazı tipi dosyası, oyununuzun kendine özgü harflerini oluşturur.

Varlık paketinde assets/fonts/ klasöründe dört yazı tipi bulunur. None yerine dosyanın yolunu verin:

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

Sayı, piksel cinsinden boyuttur. Bir Font nesnesinin tek bir boyutu olur; bu nedenle farklı boyutlardaki bir başlık ve puan için iki nesne gerekir. Bunları döngüden önce bir kez oluşturun: yazı tipi yüklemek dosyayı okur ve bunu her karede yapmak çok yavaştır.

Yol, main.py dosyasının bulunduğu klasöre göredir. Hatalı bir yol, programı durdurur ve aradığı dosyanın adını belirten bir FileNotFoundError hatası verir.

Her yazı tipi kendi boyutunda çizim yapar: 24 boyutundaki pixel.ttf, yaklaşık olarak 32 boyutundaki yerleşik yazı tipi kadar uzundur; bu nedenle göz kararı karşılaştırıp ayarlayın.

challenge icon

Görev

Kolay
  1. font'u, boyutu 24 olacak şekilde assets/fonts/pixel.ttf dosyasına ayarla.
  2. Aynı dosyayı 48 boyutunda kullanarak big_font ekle.
  3. Meteor Dodge ve Game over metinlerini big_font ile çiz.

Kendin dene

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

Oyun Kuralları bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground