Menu
CoddyTech

Nhóm

Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 18 trên 39.

Sprite thường xuất hiện thành nhóm: kẻ địch, tia laser, đồng xu. Một Group chứa nhiều sprite và thực hiện cùng một thao tác với tất cả:

enemies = pygame.sprite.Group()
for i in range(5):
    enemies.add(Enemy(64 + i * 128, 60))

Hai lệnh gọi trong vòng lặp thay cho các vòng lặp bạn đã viết để duyệt qua một danh sách:

enemies.update()
enemies.draw(screen)

enemies.update() gọi update() trên mọi sprite trong nhóm. enemies.draw(screen) vẽ mọi sprite bằng cách blit self.image tại self.rect: vì vậy hai tên đó phải chính xác. Sprite trong nhóm không cần có phương thức draw riêng.

Nhóm cũng biết kích thước của nó, len(enemies), và bạn có thể lặp qua nhóm bằng for enemy in enemies:. Hãy vẽ nhóm sau thao tác tô màu nền, như mọi hình ảnh khác.

challenge icon

Thử thách

Trung bình

Giữ năm kẻ địch trong một Group.

  1. Thay enemy bằng một Group có tên enemies, chứa năm sprite Enemy, đặt ở giữa tại x = 64, 192, 320, 448 và 576, tất cả đều ở y = 60.
  2. Gọi enemies.update() mỗi khung hình.
  3. Vẽ chúng bằng enemies.draw(screen), sau lệnh tô màu.

Nhấn Chơi: năm kẻ địch rơi thành một hàng. Sau đó nhấn Kiểm tra.

Tự làm thử

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Group")
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()


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 += 3
        if self.rect.top > 480:
            self.rect.bottom = 0


player = Player()
enemy = Enemy(320, 60)

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

    player.update()
    enemy.update()

    screen.fill((20, 22, 40))
    screen.blit(enemy.image, enemy.rect)
    screen.blit(player.image, player.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Sprite và hình ảnh

Tự luyện tập: Playground Pygame