Лекция · 5.6

Спрайттар соқтығысуын анықтау

Кез келген ойында кейіпкерлер бір-бірімен әрекеттеседі — доп қабырғаға тиеді, футболшы допты қайтарады, робот роботпен соғысады. Мұны «соқтығысуды анықтау» дейді. Бұл сабақта PyGame-дегі дайын құралдармен — spritecollide() функциясымен — кейіпкерлердің өзара әсерін дұрыс есептеуді үйренеміз.

Спрайт класы
Анықтама
Спрайттың екі негізгі қасиеті: 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]
🏀
Аналогия: бильярд добы қабырғаға тигенде керісінше бағытта домалайды. speed[0] мен 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() — спрайттардың соқтығысуын анықтайтын негізгі функция.
  • Соқтығысуды тексеру алгоритмі: өшіру → тексеру → қайта қосу.