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.
Thử thách
Trung bìnhGiữ cả ba kẻ địch trong một danh sách.
- 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). - 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.
- 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
5Va chạm chính xác đến từng pixel
Hình chữ nhật thật bất côngMặt nạSprite chính xác đến từng pixelVùng va chạm hình tròn3Lớp cho đối tượng trong trò chơi
Lớp đầu tiên của bạnPhương thứcSelf là đối tượngDanh sách đối tượngĐối tượng có hình ảnhDanh sách kẻ địchLớp con6Hoạt ảnh từ sprite sheet
Cắt sprite sheetBộ đếm khung hìnhTạo hoạt ảnh theo thời gianHiệu ứng nổ chỉ chạy một lầnTự luyện tập: Playground Pygame