خط من ملف
جزء من قسم قواعد اللعبة في رحلة 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()
جميع دروس قواعد اللعبة
تدرّب بنفسك: Playground لـ Pygame