Menu
CoddyTech

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 -= 6

Có 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ó.

challenge icon

Thử thách

Trung bình

Chuyển con tàu thành một Sprite.

  1. Viết class Player(pygame.sprite.Sprite) như trên: self.image là ship_image, đáy ở giữa của self.rect nằm tại (320, 470).
  2. Chuyển các dòng di chuyển và giới hạn của phần khởi đầu vào update của nó.
  3. Tạo player = Player(), gọi player.update() ở mỗi khung hình và blit player.image tại player.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

Tự luyện tập: Playground Pygame