Menu
CoddyTech

גופן מקובץ

חלק מהיחידה חוקי המשחק במסלול ה-Pygame של Coddy. שיעור 6 מתוך 29.

pygame.font.Font(None, 32) משתמש בגופן המובנה של pygame. קל לקרוא אותו, אבל כל משחק pygame שמשתמש בו נראה אותו דבר. קובץ גופן מעניק למשחק שלך אותיות ייחודיות משלו.

בחבילת הנכסים יש ארבעה גופנים בתיקייה assets/fonts/. מעבירים את הנתיב לקובץ במקום None:

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

המספר מציין את הגודל בפיקסלים. לכל אובייקט Font יש גודל אחד, ולכן כותרת וניקוד בגדלים שונים דורשים שני אובייקטים. יוצרים אותם פעם אחת, לפני הלולאה: טעינת גופן קוראת את הקובץ, וזה איטי מדי לביצוע בכל פריים.

הנתיב הוא יחסי לתיקייה שבה נמצא main.py. נתיב שגוי עוצר את התוכנית עם FileNotFoundError ומציין את שם הקובץ שהיא חיפשה.

כל גופן מציג את הגודל שלו: pixel.ttf בגודל 24 גבוה בערך כמו הגופן המובנה בגודל 32, לכן השוו בעין והתאימו.

challenge icon

אתגר

קל
  1. הגדר את font כקובץ assets/fonts/pixel.ttf בגודל 24.
  2. הוסף את big_font, אותו קובץ בגודל 48.
  3. צייר את Meteor Dodge ואת Game over באמצעות big_font.

נסו בעצמכם

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

כל השיעורים ביחידה חוקי המשחק

תרגלו בעצמכם: Pygame אונליין