Điểm ảnh trong suốt
Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 5 trên 39.
Tệp hình ảnh luôn có dạng hình chữ nhật, nhưng tàu địch thì không. Các pixel xung quanh tàu trong suốt: mỗi pixel của PNG có một số thứ tư, gọi là alpha, nằm trong khoảng từ 0 (trong suốt) đến 255 (đục).
Phần code khởi đầu tải ba tàu địch bằng convert(), khiến thông tin alpha bị loại bỏ: mọi pixel trong suốt đều chuyển thành màu đen, và mỗi tàu địch nằm trong một khung màu đen. convert_alpha() giữ lại alpha, nên chỉ các pixel đục mới che phủ cửa sổ. Hãy dùng nó cho mọi hình không phải hình chữ nhật đặc.
Rect vẫn là toàn bộ hình chữ nhật. Hãy vẽ đường viền để thấy khung mà hình chiếm chỗ:
rect = red.get_rect(topleft=(128, 200))
screen.blit(red, rect)
pygame.draw.rect(screen, (90, 90, 120), rect, 1)Số cuối cùng, 1, vẽ đường viền dày 1 pixel thay vì tô kín Rect. Hãy quan sát các khoảng trống giữa đường viền và con tàu. Hai Rect có thể chồng lên nhau dù các hình bên trong không chạm nhau, và phép kiểm tra va chạm bằng Rect vẫn báo rằng chúng va chạm. Chương 5 sẽ khắc phục điều đó.
Thử thách
DễLoại bỏ các hộp đen xung quanh kẻ địch.
- Tải hình ảnh của ba kẻ địch bằng
.convert_alpha()thay vì.convert(). - Sau mỗi kẻ địch, vẽ đường viền cho Rect bằng
(90, 90, 120), rộng 1 pixel. Các kẻ địch vẫn ở(128, 200),(288, 200)và(448, 200).
Nhấn “Chơi”: các hộp đen biến mất và đường viền màu xám hiển thị các Rect. 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("Three Enemies")
clock = pygame.time.Clock()
red = pygame.image.load("assets/images/enemy_red.png").convert()
green = pygame.image.load("assets/images/enemy_green.png").convert()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((20, 22, 40))
screen.blit(red, (128, 200))
screen.blit(green, (288, 200))
screen.blit(yellow, (448, 200))
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