Компьютерлік ойындарды программалау әдістері
197.50K
Category: softwaresoftware

Компьютерлік ойындарды программалау әдістері

1. Компьютерлік ойындарды программалау әдістері

2.

8-Дәріс. Pygame.font модулі
Бұл сабақта біз Pygame - де мәтіннің әртүрлі қаріптермен қалай көрсетілетінін
қарастыратын боламыз. Олармен жұмыс істеу үшін кіріктірілген модуль бар:
pygame.font.
онда келесі пайдалы кластар мен функциялар анықталған:
SysFont (fontname, size) – size өлшемімен (пиксельмен) алдын ала орнатылған
қаріпті (fontname атымен)таңдауға арналған класс;
Font (path, size) – қаріпті size өлшемімен (пиксельмен)көрсетілген path
жолымен жүктеуге арналған класс;
get_fonts () - жүйеде алдын ала орнатылған қаріптердің аттарын қайтаратын
функция;
match_font (fontname) – алдын ала орнатылған қаріпке оның атымен жолды
қайтаратын функция.

3.

Мысалы, құрылғыда орнатылған барлық қаріптердің тізімін осылай алуға
болады:
import pygame
pygame.init()
print( pygame.font.get_fonts() )
Және олардың біріншісін таңдап аламыз:
f_sys = pygame.font.SysFont('arial', 12)
Нәтижесінде біз f_sys айнымалысы сілтеме жасайтын Font класының данасын
аламыз. Әрі қарай, осы айнымалыны пайдаланып, біз таңдалған қаріппен
жұмыс істей аламыз.Сол сияқты екінші класс та қолданылады:
f = pygame.font.Font('fonts/YandexSDLight.ttf', 24)

4.

Бұл жерде біз қаріптің толық жолын көрсетеміз (әдетте бұл біздің бағдарламада
қолданғымыз келетін стандартты емес қаріп). Оның көмегімен мәтін салайық.
Бағдарлама коды келесідей болады:
import pygame
pygame.init()
W, H = 600, 400
sc = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Шрифты")
pygame.display.set_icon(pygame.image.load("app.bmp"))
clock = pygame.time.Clock()
FPS = 60
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (239, 228, 176)

5.

f = pygame.font.Font('fonts/YandexSDLight.ttf', 24)
sc_text = f.render('Привет мир!', 1, RED, YELLOW)
pos = sc_text.get_rect(center=(W//2, H//2))
sc.fill(WHITE)
sc.blit(sc_text, pos)
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
clock.tick(FPS)

6.

Қараңыз, алдымен render әдісі таңдалған қаріппен «Привет мир!" мәтінін жазатын
Surface қабатын қалыптастыру үшін шақырылады. 1-Параметр әріптердің
шекараларын тегістеу үшін қолданылады (0-тегістеусіз), содан кейін түсі және
фон түсі келеді. Осыдан кейін біз қолданба терезесінің клиенттік аймағының
ортасында орналасқан sc_text бетінің тікбұрышты аймағының координаттарын
аламыз. Әрі қарай, белгілі blit әдісін қолдана отырып, терезеде мәтінді көрсетеміз.
Бағдарламаның нәтижесі келесідей:

7.

Pygame-де мәтінді көрсету үшін осы әрекеттерді орындау қажет. Алайда, егер
біз осы кітапханада қолданылатын қаріпті қолданғымыз келсе, онда қаріп
атауының орнына жоғарыдағы көрсетілген кластарда None мәнін көрсету
керек, мысалы:
f = pygame.font.Font(None, 24)

8.

Назар аударыңыз, біз мұнда (x, y) координаттар кортежін емес, hero қабатын
орналастыру үшін Rect нысанын blit әдісіне жібереміз.
қасиеттерден басқа, Rect класында бірнеше пайдалы әдістер бар. Мысалы:
Rect.move(x, y) – x, y бойынша орын ауыстыру арқылы жаңа тіктөртбұрыш
қайтарады;
Rect.move_ip(x, y) – ағымдағы тіктөртбұрыштың координаттарын x, y
бойынша орын ауыстыру арқылы өзгертеді;
Rect.clip(Rect) – берілген тіктөртбұрыштың көрсетілген өлшемдеріне сәйкес
тіктөртбұрыштың шекараларын кеседі;
Rect.union(Rect) – екі тіктөртбұрышты біреуіне біріктіру нәтижесі бар жаңа
тіктөртбұрышты қайтарады;
Rect.union_ip – екі тіктөртбұрышты біреуіне біріктіреді;
Rect.fit(Rect) – берілген тіктөртбұрыштың өлшемі бойынша өзгертілген және
орнын ауыстырған жаңа тіктөртбұрышты қайтарады;
Rect.contains(Rect) – тексереді: бір тіктөртбұрыштың екіншісінің ішінде баржоғын.

9.

Бұл Rect класының кейбір әдістері ғана. Олардың толық тізімін
ресми құжаттама бетінен көруге болады:
https://www.pygame.org/docs/ref/rect.html
Және аттас әдістердегі _ip жұрнағына назар аударыңыз. Ол
өзгертулер сыныптың ағымдағы данасы үшін жаңасын жасамай
жасалуы керек екенін көрсетеді. Егер бұл жұрнақ болмаса, онда әдіс
Rect класының жаңа объектісін жасайды, оның қасиеттеріне тиісті
өзгерістер енгізіледі.

10.

Мысалы, бағдарламада екі Rect объектісін жасайық:
rect1 = pygame.Rect((0, 0, 30, 30))
rect2 = pygame.Rect((30, 30, 30, 30))
Және олармен келесі әрекеттерді орындаймыз:
rect2.move_ip(20, 20)
print(rect2)
rect3 = rect2.union(rect1)
print(rect3)
Жұмыстың нәтижесі төмендегі суретте көрсетілген:

11.

Мысалы, Rect класын пайдаланып, бос орын пернесін басқан кезде
кейіпкеріміздің секіру бағдарламасын жазайық

12.

import pygame
pygame.init()
W = 600
H = 400
sc = pygame.display.set_mode((W, H))
pygame.display.set_caption("Класс Rect")
pygame.display.set_icon(pygame.image.load("app.bmp"))
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
FPS = 60
# число кадров в секунду
clock = pygame.time.Clock()

13.

ground = H-70
jump_force = 20 # сила прыжка
move = jump_force+1
hero = pygame.Surface((40, 50))
hero.fill(BLUE)
rect = hero.get_rect(centerx=W//2)
rect.bottom = ground
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()

14.

elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE and ground == rect.bottom:
move = -jump_force
if move <= jump_force:
if rect.bottom + move < ground:
rect.bottom += move
if move < jump_force:
move += 1
else:
rect.bottom = ground
move = jump_force+1
sc.fill(WHITE)
sc.blit(hero, rect)
pygame.display.update()
clock.tick(FPS)

15.

Мұнда біз көмекші айнымалыларды анықтадық:
ground -жердің биіктігі;
jump_force-секіру күші;
move-ағымдағы тік жылдамдық.
Содан кейін, rect.bottom қасиетін пайдаланып, кейіпкерді көлденеңінен ортасына
және жер деңгейіне орналастырамыз. Назар аударыңыз, бұл сипатты өзгерту
арқылы жоғарғы сол жақ бұрыштың x, y координаттарының қасиеттері автоматты
түрде өзгереді. Яғни, біз тіктөртбұрышты жер деңгейіне дейін жылжытамыз. Әрі
қарай, бос орынды басу арқылы мән орнатылады move = - jump_force-кейіпкер
jump_force бастапқы жылдамдығымен жоғары секіреді. Негізгі циклде тексеру
бар: егер қозғалыс жылдамдығы jump_force-тен аз немесе оған тең болса, онда біз
кейіпкерді осы шамаға ауыстырамыз және жылдамдықты бірлікке азайтамыз
(move += 1). Біз бұл операцияларды кейіпкер қайтадан жер деңгейінде болғанша
жасаймыз. Содан кейін оның жылдамдығы жасанды түрде move = jump_force+1ге тең болады, осылайша секіру шарты жұмыс істемейді және ол тоқтайды.
Бұл мысал қарапайым анимацияны жүзеге асыру үшін RECT класын қалай
пайдалануға болатындығын көрсетеді.

16.

Тыңдағандарыңызға рахмет
English     Русский Rules