Лекция · 5.6
Спрайттар соқтығысуын анықтау
Кез келген ойында кейіпкерлер бір-бірімен әрекеттеседі — доп қабырғаға тиеді, футболшы допты қайтарады, робот роботпен соғысады. Мұны «соқтығысуды анықтау» дейді. Бұл сабақта PyGame-дегі дайын құралдармен — spritecollide() функциясымен — кейіпкерлердің өзара әсерін дұрыс есептеуді үйренеміз.
Спрайт класы
Анықтама
Спрайттың екі негізгі қасиеті: image — бейнеленген сурет, rect — спрайтты қамтитын тіктөртбұрышты аймақ.
Спрайттың екі негізгі қасиеті: image — бейнеленген сурет, rect — спрайтты қамтитын тіктөртбұрышты аймақ.
Бірнеше бірдей типті кейіпкер (мыс. роботтар) керек болса, оларды жеке класс ретінде сипаттау ыңғайлы:
class Robots(pygame.sprite.Sprite): def __init__(self, image_file, location): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location
Осы класс негізінде for циклі арқылы қалаған санда робот жасауға болады — әрқайсысына жеке координата беру жеткілікті.
move() әдісі мен серпіліс
Анықтама
move() әдісі спрайтты speed параметріне сай жылжытады; экран шекарасына жеткенде сәйкес бағыттағы жылдамдық таңбасы теріске ауысады.
def move(self): self.rect = self.rect.move(self.speed) if self.rect.left < 0 or self.rect.right > width: self.speed[0] = -self.speed[0] if self.rect.top < 0 or self.rect.bottom > height: self.speed[1] = -self.speed[1]
spritecollide() арқылы соқтығысуды анықтау
Анықтама
pygame.sprite.spritecollide(sprite, group, dokill) — берілген спрайттың топтағы (group) басқа спрайттармен соқтығысқанын тексереді, соқтығысқандар тізімін қайтарады. dokill=False болса, олар топтан өшірілмейді.
| № | Қадам |
|---|---|
| 1 | Спрайтты уақытша топтан (group) өшіру |
| 2 | Осы спрайттың топтағы басқалармен соқтығысуын spritecollide() арқылы тексеру |
| 3 | Спрайтты қайта топқа қосу |
def animate(group): screen.fill([255, 255, 255]) for robot in group: robot.move() for robot in group: group.remove(robot) if pygame.sprite.spritecollide(robot, group, False): robot.speed[0] = -robot.speed[0] robot.speed[1] = -robot.speed[1] group.add(robot) screen.blit(robot.image, robot.rect) pygame.display.flip()
Ескерту: спрайтты тексеру алдында топтан уақытша өшіру керек — әйтпесе ол «өзімен өзі соқтығысты» деп қате есептеледі (spritecollide спрайттың өзін де тексереді).
🎯 ҰБТ байланысы
Соқтығысуды анықтау — ойын нәтижесін есептеудің негізі.
1
spritecollide() 3 параметр қабылдайды: спрайт, топ, dokill.
2
Серпіліс — speed таңбасын теріске ауыстыру арқылы жүзеге асады.
3
Соқтығысуды тексеру алгоритмі 3 қадамнан тұрады (өшіру-тексеру-қосу).
Сабақ қорытындысы
- Спрайт класы image және rect қасиеттерінен тұрады.
move()әдісі спрайтты жылжытады, шекараға жеткенде серпіледі.spritecollide()— спрайттардың соқтығысуын анықтайтын негізгі функция.- Соқтығысуды тексеру алгоритмі: өшіру → тексеру → қайта қосу.