Đố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ó.
Thử thách
Trung bìnhChuyển kẻ địch màu đỏ thành một đối tượng.
- Bên dưới phần tải hình ảnh, viết lớp
Enemynhư ở trên. - Thay
red_rectbằngred_enemy = Enemy(red, 160, 100), rồi đưared_rectra khỏi vòng lặpfor. - Trong vòng lặp, gọi
red_enemy.update(), rồi gọired_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
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