Menu
CoddyTech

切割精灵图

本课属于 Coddy Pygame 学习旅程的“精灵与图像”单元。第 26 课,共 39 课。

动画就是一张张图片依次显示。游戏常把这些图片放在同一个文件里,称为精灵表:许多小帧并排组成的网格。入门代码会完整绘制 assets/sheets/platformer_characters.png,横向 9 帧、纵向 3 帧,每帧为 24 × 24 像素。绿色角色的两个行走姿势是顶行的前两帧。

sheet.subsurface(rect) 会把工作表中 Rect 内的部分作为独立的 Surface 返回,不会复制像素。第 row 行中编号为 col 的帧,起始位置是 (col * 24, row * 24):

frames = []
for col in (0, 1):
    frame = sheet.subsurface((col * 24, 0, 24, 24))
    frames.append(pygame.transform.scale_by(frame, 3))

在 640 × 480 的窗口中,24 像素很小,所以每帧会放大 3 倍,变成 72 × 72。像素艺术按整数倍放大,边缘仍然清晰。在循环开始前裁剪并缩放一次,然后把这些帧保存在列表中:接下来的课会根据索引选取其中一帧。

challenge icon

挑战

中等

从精灵图中裁剪出两帧行走动画。

  1. 在循环之前,创建 frames:取顶行第 0 列和第 1 列的帧,每帧大小为 24 × 24,再放大 3 倍。
  2. 不要绘制整张精灵图,而是在 (200, 200) 处绘制 frames[0],并在 (368, 200) 处绘制 frames[1]。

按“开始”:显示两帧放大的行走动画。然后按“检查”。

亲手试试

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Sprite Sheet")
clock = pygame.time.Clock()

sheet = pygame.image.load("assets/sheets/platformer_characters.png").convert_alpha()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((20, 22, 40))
    screen.blit(sheet, (212, 204))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

精灵与图像中的所有课

自己练习: Pygame 在线编辑器