Nhóm
Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 18 trên 39.
Sprite thường xuất hiện thành nhóm: kẻ địch, tia laser, đồng xu. Một Group chứa nhiều sprite và thực hiện cùng một thao tác với tất cả:
enemies = pygame.sprite.Group()
for i in range(5):
enemies.add(Enemy(64 + i * 128, 60))Hai lệnh gọi trong vòng lặp thay cho các vòng lặp bạn đã viết để duyệt qua một danh sách:
enemies.update()
enemies.draw(screen)enemies.update() gọi update() trên mọi sprite trong nhóm. enemies.draw(screen) vẽ mọi sprite bằng cách blit self.image tại self.rect: vì vậy hai tên đó phải chính xác. Sprite trong nhóm không cần có phương thức draw riêng.
Nhóm cũng biết kích thước của nó, len(enemies), và bạn có thể lặp qua nhóm bằng for enemy in enemies:. Hãy vẽ nhóm sau thao tác tô màu nền, như mọi hình ảnh khác.
Thử thách
Trung bìnhGiữ năm kẻ địch trong một Group.
- Thay
enemybằng một Group có tênenemies, chứa năm sprite Enemy, đặt ở giữa tại x = 64, 192, 320, 448 và 576, tất cả đều ở y = 60. - Gọi
enemies.update()mỗi khung hình. - Vẽ chúng bằng
enemies.draw(screen), sau lệnh tô màu.
Nhấn Chơi: năm kẻ địch rơi thành một hàng. 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 Group")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
enemy_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
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
if keys[pygame.K_RIGHT]:
self.rect.x += 6
self.rect.clamp_ip(screen.get_rect())
class Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = enemy_image
self.rect = self.image.get_rect(center=(x, y))
def update(self):
self.rect.y += 3
if self.rect.top > 480:
self.rect.bottom = 0
player = Player()
enemy = Enemy(320, 60)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player.update()
enemy.update()
screen.fill((20, 22, 40))
screen.blit(enemy.image, enemy.rect)
screen.blit(player.image, player.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