کار با متن‌ها در Pygame

Working with Texts in Pygame

03 آبان 1400
Working-with-Texts-in-Pygame

پیش گفتار

متن ها قسمت مهمی در بازی ها هستند زیرا برای ارتباط برقرار کردن با بازیکن به کار می روند. در این قسمت با متن ها و شیوه استفاده از فونت ها آشنا می شویم.

کار با متن ها

در pygame، نمی توان متن را مستقیما روی صفحه نوشت. نخستین گام برای نمایش متن در پنجره ایجاد یک شی Font با اندازه فونت داده شده است. گام بعدی رندر کردن متن در یک تصویر با رنگ مشخص است. گام سوم نمایش تصویر روی صفحه است. پس ابتدا فونت را درست می کنیم سپس فونت را در داخل یک تصویر گذاشته سپس تصویر را در پنجره نمایش می دهیم. این مراحل در زیر آمده اند:

font = pygame. font. SysFont(None, 24)
img = font. render('hello', True, BLUE)
screen. blit(img, (20, 20))

به محض ایجاد فونت، اندازه آن قابل تغییر نیست. از یک شی Font برای ایجاد یک شی Surface از یک رشته استفاده می شود.   نمی توان به طور مستقیم با Pygame یک متن را بر روی یک شی Surface نمایش داد. برای ایجاد یک شی Surface از متن باید از متد render استفاده کنیم.

مقداردهی (Initializing) یک فونت

مقدار دهی اولیه فونت می تواند چند ثانیه طول بکشد. با کد زیر می توانیم بفهمیم که زمان ساخت فونت چه قدر بوده است:

t0 = time. time()
font = pygame. font. SysFont(None, 48)
print('time needed for Font creation :', time. time()-t0)

نتیجه اجرای کد در زیر آمده است:

time needed for Font creation : 8. 230187892913818

تابع get_fonts آرایه ای از همه فونت های نصب شده را برمی گرداند. کد زیر بررسی می کند که چه فونت هایی در سیستم شما وجود دارد و تعداد آن ها چیست و سپس آن ها را در کنسول چاپ می کند:

fonts = pygame. font. get_fonts()
print(len(fonts))
for f in fonts:
print(f)

نتیجه اجرای کد در زیر آمده است:

344
bigcaslonttf
silomttf
sfnsdisplayblackitalicotf
chalkdusterttf
. . . 

نمایش متن

شی font می تواند یک متن داده شده را به یک تصویر تبدیل کند. در مثال زیر، یک مستطیل محاطی آبی رنگ در اطراف تصویر متن خود قرار می دهیم:

img = font. render(sysfont, True, RED)
rect = img. get_rect()
pygame. draw. rect(img, BLUE, rect, 1)

سپس دو فونت دیگر با نام های Chalkduster و Didot با اندازه 72 ایجاد می کنیم. متن را با هر دو فونت نمایش می دهیم:

font1 = pygame. font. SysFont('chalkduster. ttf', 72)
img1 = font1. render('chalkduster. ttf', True, BLUE)
font2 = pygame. font. SysFont('didot. ttc', 72)
img2 = font2. render('didot. ttc', True, GREEN)

در آخر تصاویر متن همانند تصاویر معمولی در پنجره نمایش داده می شوند:

screen. fill(background)
screen. blit(img, (20, 20))
screen. blit(img1, (20, 50))
screen. blit(img2, (20, 120))
pygame. display. update()

نتیجه اجرای کد در زیر آمده است:

کل کد در زیر آمده است:

"""Draw text to the screen. """
import pygame
from pygame. locals import *
import time
 
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
GRAY = (200, 200, 200)

pygame. init()
screen = pygame. display. set_mode((640, 240))

sysfont = pygame. font. get_default_font()
print('system font :', sysfont)

t0 = time. time()
font = pygame. font. SysFont(None, 48)
print('time needed for Font creation :', time. time()-t0)

img = font. render(sysfont, True, RED)
rect = img. get_rect()
pygame. draw. rect(img, BLUE, rect, 1)

font1 = pygame. font. SysFont('chalkduster. ttf', 72)
img1 = font1. render('chalkduster. ttf', True, BLUE)

font2 = pygame. font. SysFont('didot. ttc', 72)
img2 = font2. render('didot. ttc', True, GREEN)

fonts = pygame. font. get_fonts()
print(len(fonts))
for i in range(7):
    print(fonts[i])

running = True
background = GRAY
while running:
    for event in pygame. event. get():
        if event. type == QUIT:
            running = False

    screen. fill(background)
    screen. blit(img, (20, 20))
    screen. blit(img1, (20, 50))
    screen. blit(img2, (20, 120))
    pygame. display. update()

pygame. quit()

ویرایش متن با کیبورد

از رویداد keyboard می توان برای ویرایش متن استفاده کرد. ابتدا متنی را ایجاد می کنیم و سپس آن را در یک تصویر رندر می کنیم:

text = 'this text is editable'
font = pygame. font. SysFont(None, 48)
img = font. render(text, True, RED)

سپس مستطیل محاط کننده و هم چنین مستطیل که برای نمایش مکان نما (cursor) به کار می رود را تعریف می کنیم:

text = 'this text is editable'
font = pygame. font. SysFont(None, 48)
img = font. render(text, True, RED)

در داخل حلقه رویداد مراقب رویدادهای KEYDOWN هستیم. اگر کلید فشار BACKSPACE باشد و طول رشته بزرگ تر از 0 باشد، آخرین کاراکتر را حذف می کنیم، در غیر این صورت کاراکتر جدید را به متغیر text اضافه می کنیم:

if event. type == KEYDOWN:
    if event. key == K_BACKSPACE:
        if len(text)>0:
            text = text[:-1]
    else:
        text += event. unicode

سپس متن اصلاح شده را رندر می کنیم، مستطیل محاط کننده را به روز می کنیم و جعبه مکان نما را در انتهای مستطیل محاط شده به روز شده قرار می دهیم:

img = font. render(text, True, RED)
rect. size=img. get_size()
cursor. topleft = rect. topright

افزودن cursor چشمک زن

برای این که مکان نما بیشتر نمایان شود، اجازه می دهیم هر 0. 5 ثانیه چشمک بزند. این کار را با استفاده از ()time. time انجام می دهیم:

screen. fill(background)
screen. blit(img, rect)
if time. time() % 1 > 0. 5:
    pygame. draw. rect(screen, RED, cursor)
pygame. display. update()

نتیجه اجرای کد در زیر آمده است:

"""Edit text with the keyboard. """
import pygame
from pygame. locals import *
import time
 
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GRAY = (200, 200, 200)

pygame. init()
screen = pygame. display. set_mode((640, 240))

text = 'this text is editable'
font = pygame. font. SysFont(None, 48)
img = font. render(text, True, RED)

rect = img. get_rect()
rect. topleft = (20, 20)
cursor = Rect(rect. topright, (3, rect. height))

running = True
background = GRAY

while running:
    for event in pygame. event. get():
        if event. type == QUIT:
            running = False
        
        if event. type == KEYDOWN:
            if event. key == K_BACKSPACE:
                if len(text)>0:
                    text = text[:-1]
            else:
                text += event. unicode
            img = font. render(text, True, RED)
            rect. size=img. get_size()
            cursor. topleft = rect. topright
    
    screen. fill(background)
    screen. blit(img, rect)
    if time. time() % 1 > 0. 5:
        pygame. draw. rect(screen, RED, cursor)
    pygame. display. update()

pygame. quit()
تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری بازی‌سازی با پایتون توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.