Lớp Sprite
Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 17 trên 39.
Mọi đối tượng trong trò chơi từ trước đến nay đều có hình ảnh, một Rect, một update và cách để được vẽ. pygame có một lớp được tạo ra chính xác cho việc đó: pygame.sprite.Sprite. Các đối tượng trong trò chơi của bạn sẽ trở thành lớp con của lớp này:
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect(midbottom=(320, 470))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 6Có ba quy tắc. Gọi super().__init__() trước: hàm này thiết lập những gì lớp Sprite cần bên trong. Đặt tên cho hình ảnh là self.image và vị trí là self.rect, chính xác như vậy: code của pygame đọc hai tên này. Đặt các quy tắc áp dụng cho từng khung hình vào update.
Hình ảnh con tàu được tải một lần ở đầu chương trình, với tên ship_image, và lớp này sử dụng hình ảnh đó. Hiện tại, hãy vẽ sprite bằng blit: screen.blit(player.image, player.rect). Bài học tiếp theo sẽ cho phép pygame vẽ nó.
Thử thách
Trung bìnhChuyển con tàu thành một Sprite.
- Viết
class Player(pygame.sprite.Sprite)như trên:self.imagelàship_image, đáy ở giữa củaself.rectnằm tại(320, 470). - Chuyển các dòng di chuyển và giới hạn của phần khởi đầu vào
updatecủa nó. - Tạo
player = Player(), gọiplayer.update()ở mỗi khung hình và blitplayer.imagetạiplayer.rect.
Nhấn Chơi và giữ các phím mũi tên: con tàu di chuyển 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("Sprite Ship")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship_image.get_rect(midbottom=(320, 470))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
ship_rect.x -= 6
if keys[pygame.K_RIGHT]:
ship_rect.x += 6
ship_rect.clamp_ip(screen.get_rect())
screen.fill((20, 22, 40))
screen.blit(ship_image, ship_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