Menu
CoddyTech

Lớp con

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

Một số kẻ địch nên di chuyển theo đường zíc zắc. Chúng rơi xuống như những kẻ địch khác, đồng thời trượt sang hai bên và đổi hướng khi chạm mép cửa sổ. Sao chép toàn bộ lớp Enemy chỉ để thay đổi một phương thức đồng nghĩa với việc phải sửa mỗi lỗi hai lần. Một lớp con kế thừa mọi thứ từ lớp cha và chỉ thay đổi những điểm khác biệt:

class Zigzag(Enemy):
    def __init__(self, image, x, y):
        super().__init__(image, x, y)
        self.dx = 3

    def update(self):
        super().update()
        self.rect.x += self.dx
        if self.rect.left < 0 or self.rect.right > 640:
            self.dx = -self.dx

class Zigzag(Enemy) có nghĩa là Zigzag là một Enemy. Nó có draw mà không cần viết lại. Phương thức update riêng của nó thay thế phương thức của lớp cha, còn super().update() chạy phiên bản của lớp cha trước, nên không cần viết lại phần rơi xuống và quay về phía trên. super().__init__(...) cũng làm tương tự khi khởi tạo.

Một Zigzag nằm trong cùng danh sách với những kẻ địch khác: vòng lặp gọi enemy.update() và mỗi đối tượng chạy phiên bản update riêng của mình.

challenge icon

Thử thách

Trung bình

Cho kẻ địch màu vàng di chuyển zíc zắc.

  1. Viết class Zigzag(Enemy): __init__ gọi super().__init__(image, x, y) và đặt self.dx = 3.
  2. Phương thức update gọi super().update(), cộng self.dx vào self.rect.x và đảo chiều self.dx khi Rect nhô ra khỏi mép trái hoặc mép phải.
  3. Đổi kẻ địch màu vàng thành Zigzag.

Nhấn “Chơi”: kẻ địch màu vàng di chuyển zíc zắ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)


enemies = [Enemy(red, 160, 100), Enemy(green, 320, 100), Enemy(yellow, 480, 100)]

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

    for enemy in enemies:
        enemy.update()

    screen.fill((20, 22, 40))
    for enemy in enemies:
        enemy.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

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

Tự luyện tập: Playground Pygame