Menu
CoddyTech

Grup Melawan Grup

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

Laser harus menghancurkan musuh. Ini adalah satu grup melawan grup lain: laser mana pun melawan musuh mana pun. groupcollide menguji setiap pasangan sekaligus:

hits = pygame.sprite.groupcollide(enemies, lasers, True, True)
score += len(hits)

Kedua True adalah flag dokill, satu untuk setiap grup: yang pertama menghapus musuh yang terkena, yang kedua menghapus laser yang mengenainya. Laser yang terus melaju setelah mengenai musuh dapat menghabisi musuh kedua di atas musuh pertama.

hits adalah sebuah dictionary: setiap musuh yang terkena menjadi key, dan nilainya adalah list laser yang mengenainya. len(hits) adalah jumlah musuh yang terkena pada frame ini, meskipun dua laser mengenai musuh yang sama.

Urutan grup menentukan apa yang menjadi key. Dengan groupcollide(lasers, enemies, True, True), key-nya adalah laser, dan len(hits) akan menghitung jumlah laser.

challenge icon

Tantangan

Sedang
  1. Setelah pembaruan, uji enemies terhadap lasers dengan pygame.sprite.groupcollide, lalu hapus enemy dan laser.
  2. Tambahkan jumlah enemy yang terkena ke score.

Coba sendiri

import pygame

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

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
enemy_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
font = pygame.font.Font(None, 32)


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 Enemy(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = enemy_image
        self.rect = self.image.get_rect(center=(x, y))

    def update(self):
        self.rect.y += 1
        if self.rect.top > 480:
            self.rect.bottom = 0


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()
enemies = pygame.sprite.Group()
for i in range(5):
    enemies.add(Enemy(64 + i * 128, 60))
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            lasers.add(Laser(player.rect.centerx, player.rect.top))

    player.update()
    lasers.update()
    enemies.update()

    screen.fill((20, 22, 40))
    enemies.draw(screen)
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(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