Menu
CoddyTech

Ledakan

Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 34 dari 36.

Musuh yang lenyap dalam satu frame terasa seolah tidak terjadi apa-apa. Letakkan ledakan di tempatnya: animasi sekali putar dari bab 6, sebagai sprite dalam grup tersendiri.

for enemy in hits:
    score += 10
    explosions.add(Explosion(enemy.rect.center))

Sprite yang terbunuh masih memiliki Rect, jadi enemy.rect.center adalah lokasi saat sprite itu terkena. Ledakan memainkan explosion_1.png hingga explosion_4.png, masing-masing selama 5 frame, lalu menghapus dirinya sendiri.

Muat keempat gambar ke dalam sebuah list, explosion_frames, sebelum perulangan. Perbarui explosions setiap frame dan gambar paling akhir, di atas semua yang lain, agar ledakan menutupi kapal dan laser yang bertumpang tindih dengannya.

Suara, layar yang bergetar, dan percikan yang beterbangan hadir di bagian 6, dibuat dengan perulangan yang sama ini.

challenge icon

Tantangan

Sedang
  1. Muat explosion_1.png hingga explosion_4.png ke dalam list explosion_frames.
  2. Tulis class Explosion dari pelajaran A One-Shot Explosion, yang dibuat dengan center.
  3. Buat explosions = pygame.sprite.Group(), tambahkan Explosion pada setiap musuh yang dihancurkan, perbarui setiap frame, lalu gambar setelah kapal.

Coba sendiri

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
red_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = ship_image
        self.rect = self.image.get_rect(midbottom=(320, 470))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 6
        if keys[pygame.K_RIGHT]:
            self.rect.x += 6
        self.rect.clamp_ip(screen.get_rect())


class Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = laser_image
        self.rect = self.image.get_rect(midbottom=(x, y))
        self.mask = pygame.mask.from_surface(self.image)

    def update(self):
        self.rect.y -= 10
        if self.rect.bottom < 0:
            self.kill()


class Enemy(pygame.sprite.Sprite):
    def __init__(self, image, x, y, speed):
        super().__init__()
        self.image = image
        self.rect = self.image.get_rect(center=(x, y))
        self.mask = pygame.mask.from_surface(self.image)
        self.speed = speed

    def update(self):
        self.rect.y += self.speed


def spawn_wave(image, count, speed):
    for i in range(count):
        x = random.randint(40, 600)
        enemies.add(Enemy(image, x, -40 - i * 120, speed))


player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
last_shot = 0
score = 0
spawn_wave(red_image, 6, 2)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    keys = pygame.key.get_pressed()
    now = pygame.time.get_ticks()
    if keys[pygame.K_SPACE] and now - last_shot >= 250:
        lasers.add(Laser(player.rect.centerx, player.rect.top))
        last_shot = now
    lasers.update()
    enemies.update()
    for enemy in enemies:
        if enemy.rect.top > 480:
            enemy.kill()
    hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
    for enemy in hits:
        score += 10

    screen.fill((12, 14, 30))
    enemies.draw(screen)
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Sprite dan Gambar

Latihan sendiri: Playground Pygame