גופן מקובץ
חלק מהיחידה חוקי המשחק במסלול ה-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, לכן השוו בעין והתאימו.
אתגר
קל- הגדר את
fontכקובץassets/fonts/pixel.ttfבגודל 24. - הוסף את
big_font, אותו קובץ בגודל 48. - צייר את
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 אונליין