Глава 21 · Проект: космический шутер

Анимация взрыва

Тот же while-накопитель времени, что и в главе 20 — теперь для взрыва, а не для ходьбы.

Взрыв — такой же спрайт, как пуля или враг, но вместо движения у него собственная анимация из нескольких кадров. Раздел 20.23 уже показывал правильный приём для таймера анимации — здесь он применяется во второй раз, теперь для взрыва:

fragment_explosion.py
class Explosion(pygame.sprite.Sprite):
    def __init__(self, frames, center):
        super().__init__()
        self.frames = frames
        self.frame_index = 0
        self.animation_time = 0.0
        self.image = self.frames[0]
        self.rect = self.image.get_rect(center=center)

    def update(self, dt):
        self.animation_time += dt
        while self.animation_time >= EXPLOSION_FRAME_INTERVAL:
            self.animation_time -= EXPLOSION_FRAME_INTERVAL
            self.frame_index += 1
            if self.frame_index >= len(self.frames):
                self.kill()
                return
            self.image = self.frames[self.frame_index]
Три реальных окна рядом: пуля летит вверх, враг перед попаданием, оранжевая вспышка взрыва после попадания
Реальная последовательность: выстрел, сближение с врагом, взрыв в момент попадания.
kill() сразу после последнего кадра
Как только frame_index выходит за пределы списка кадров, спрайт удаляет себя из всех групп (.kill()) — без этого завершённые взрывы копились бы в self.explosions бесконечно, занимая память и время отрисовки без всякой пользы.
Практика: таймер анимации взрыва
Проверяется прямо в браузере — установка Pygame не требуется
Практика выполняется локально
Открыть практику →