Menu
CoddyTech

Đối tượng có hình ảnh

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

Kẻ địch là các hình ảnh di chuyển trên những Rect, còn phần code ban đầu tự quản lý ba Rect và ba lệnh blit. Một lớp có thể lưu hình ảnh cùng Rect của nó:

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)

Hình ảnh được truyền vào, chứ không được tải trong __init__. Tải mỗi tệp một lần ở đầu chương trình rồi truyền cùng một Surface cho mọi kẻ địch dùng hình đó: mười kẻ địch màu đỏ dùng chung một hình màu đỏ. Tuy vậy, mỗi kẻ địch có Rect riêng, nên chúng di chuyển độc lập.

Di chuyển kẻ địch là di chuyển Rect của nó, còn vẽ kẻ địch là dùng lệnh blit để vẽ hình ảnh tại vị trí Rect: đây là hai thuộc tính mà mọi đối tượng trong trò chơi ở phần này đều có.

challenge icon

Thử thách

Trung bình

Chuyển kẻ địch màu đỏ thành một đối tượng.

  1. Bên dưới phần tải hình ảnh, viết lớp Enemy như ở trên.
  2. Thay red_rect bằng red_enemy = Enemy(red, 160, 100), rồi đưa red_rect ra khỏi vòng lặp for.
  3. Trong vòng lặp, gọi red_enemy.update(), rồi gọi red_enemy.draw(screen) sau lệnh tô nền, thay cho lệnh blit hình màu đỏ.

Nhấn Chơi: cả 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()

red_rect = red.get_rect(center=(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

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

    screen.fill((20, 22, 40))
    screen.blit(red, red_rect)
    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