Similar presentations:
Компьютерлік ойындарды программалау әдістері
1. Компьютерлік ойындарды программалау әдістері
2.
6-Дәріс. RECT Класы. Оның рөлі, қасиеттері мен әдістеріОйындарды әзірлеу кезінде көбінесе кейіпкерлердің, қоршаған заттардың
шекараларын анықтау, олардың соқтығысу сәттерін анықтау қажет. Осы
тапсырмалардың барлығында PyGame арнайы объектіні пайдаланады:
Rect (Rectangle үшін қысқартылған – тіктөртбұрыш)
Назар аударыңыз, Rect тіктөртбұрыштарды салуға арналған класс емес, бұл
тікбұрышты аймақтармен жұмыс істеуге арналған класс және оның сурет салуға
тікелей қатысы жоқ.
3.
Тікбұрышты аймақтарМысалы, PyGame-де әр беттің әдісі бар:
Surface.get_rect()
Rect класы бұл қабаттың өлшемдерімен қайтарады. Бастапқы мысал ретінде
мына қарапайым бағдарламаны қарастырыңыз:
4.
import pygamepygame.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()
5.
hero = pygame.Surface((40, 50))hero.fill(BLUE)
rect = hero.get_rect()
print(rect)
sc.fill(WHITE)
sc.blit(hero, (100, 50))
pygame.display.update()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
clock.tick(FPS)
6.
Қараңыз, бізде 40x50 пиксель өлшемдері бар hero (батыр) беті анықталған. Соданкейін, операция арқылы:
rect = hero.get_rect()
біз осы аймақтың өлшемдеріне Rect класының данасы ретінде сілтеме аламыз.
Сонымен қатар, бұл сыныптың келесі пайдалы қасиеттері бар:
7.
Мысалы, біз center атрибутына жүгініп, кейіпкеріміздің орталықкоординаттарын біле аламыз:
print(rect.center)
Сондай ақ get_rect әдісі бірқатар қосымша, пайдалы аталған параметрлерге
ие. Мысалы, жоғарғы сол жақ бұрыштың координаттарының берілген
бастапқы орнын анықтау үшін келесі параметрді көрсету керек:
rect = hero.get_rect(topleft=(200, 50))
Немесе клиент аймағының ортасындағы тіктөртбұрыштың координаттарын
анықтау үшін келесі команданы жазуға болады:
rect = hero.get_rect(center = (W//2, H//2))
немесе:
rect = hero.get_rect(centerx = W//2, centery = H//2)
Енді біз кейіпкерді терезенің дәл ортасына орналастыра аламыз:
sc.blit(hero, rect)
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 pygamepygame.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-70jump_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 класын қалай
пайдалануға болатындығын көрсетеді.