متن ها قسمت مهمی در بازی ها هستند زیرا برای ارتباط برقرار کردن با بازیکن به کار می روند. در این قسمت با متن ها و شیوه استفاده از فونت ها آشنا می شویم.
در 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 استفاده کنیم.
مقدار دهی اولیه فونت می تواند چند ثانیه طول بکشد. با کد زیر می توانیم بفهمیم که زمان ساخت فونت چه قدر بوده است:
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
برای این که مکان نما بیشتر نمایان شود، اجازه می دهیم هر 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()
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.