Menu
CoddyTech

Danh sách kẻ địch

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

Một kẻ địch giờ đã là một đối tượng. Hai kẻ địch còn lại vẫn cần Rect và blit riêng. Hãy đưa cả ba vào một danh sách, như trường sao đã làm với các ngôi sao, rồi hai vòng lặp ngắn sẽ chạy tất cả:

enemies = [Enemy(red, 100, 50), Enemy(green, 300, 50)]

for enemy in enemies:
    enemy.update()

Bạn có thể viết từng phần tử của danh sách trong dấu ngoặc vuông như ở đây, hoặc tạo danh sách bằng append trong một vòng lặp. Mỗi kẻ địch trong danh sách di chuyển bằng Rect riêng của nó.

Chỉ giữ mỗi kẻ địch một lần trong danh sách. Kẻ địch nào cũng được cập nhật riêng bên ngoài vòng lặp sẽ di chuyển hai lần trong mỗi khung hình.

challenge icon

Thử thách

Trung bình

Giữ cả ba kẻ địch trong một danh sách.

  1. Tạo enemies, một danh sách gồm ba đối tượng Enemy: kẻ địch màu đỏ ở giữa tại (160, 100), màu xanh lá cây tại (320, 100) và màu vàng tại (480, 100).
  2. Cập nhật mọi kẻ địch trong danh sách ở vòng lặp, rồi vẽ từng kẻ địch sau khi tô nền.
  3. Xóa red_enemy, các Rect màu xanh lá cây và màu vàng cùng các dòng lệnh của chúng.

Nhấn “Chơi”: ba kẻ địch rơi xuống như trước. 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 Rain")
clock = pygame.time.Clock()

red = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
green = pygame.image.load("assets/images/enemy_green.png").convert_alpha()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert_alpha()

class Enemy:
    def __init__(self, image, x, y):
        self.image = image
        self.rect = image.get_rect(center=(x, y))
        self.speed = 2

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

    def draw(self, screen):
        screen.blit(self.image, self.rect)


red_enemy = Enemy(red, 160, 100)
green_rect = green.get_rect(center=(320, 100))
yellow_rect = yellow.get_rect(center=(480, 100))

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

    red_enemy.update()
    for rect in (green_rect, yellow_rect):
        rect.y += 2
        if rect.top > 480:
            rect.bottom = 0

    screen.fill((20, 22, 40))
    red_enemy.draw(screen)
    screen.blit(green, green_rect)
    screen.blit(yellow, yellow_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