Menu
CoddyTech

Musuh Berdatangan

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

Sekarang, musuh. Sprite Enemy mendapatkan gambar dan kecepatannya saat dibuat, jadi satu class dapat menggambar setiap jenis:

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.speed = speed

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

Satu wave terdiri dari beberapa musuh yang berbaris di atas jendela agar mereka masuk satu per satu, masing-masing 120 piksel di atas musuh sebelumnya, pada posisi x acak:

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))

Musuh pertama berpusat di y = -40, berikutnya di -160, dan seterusnya: semuanya tidak terlihat saat permainan dimulai. Sebuah fungsi menjaga wave tetap di satu tempat; pelajaran sebelumnya memanggilnya untuk setiap wave.

Musuh yang jatuh melewati bagian bawah harus disingkirkan. Di dalam perulangan utama, setelah enemies.update(), hapus setiap musuh yang bagian atasnya melewati 480. Nanti, itu akan mengurangi satu nyawa.

challenge icon

Tantangan

Sedang
  1. Tambahkan import random, muat enemy_red.png ke dalam red_image, lalu tulis Enemy dan spawn_wave.
  2. Buat enemies = pygame.sprite.Group(), lalu panggil spawn_wave(red_image, 6, 2).
  3. Pada setiap frame, perbarui enemy, hapus yang rect.top-nya melewati 480, lalu gambar enemy sebelum laser.

Coba sendiri

import pygame

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

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.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))

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


player = Player()
lasers = pygame.sprite.Group()
last_shot = 0

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()

    screen.fill((12, 14, 30))
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    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