切割精灵图
本课属于 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。像素艺术按整数倍放大,边缘仍然清晰。在循环开始前裁剪并缩放一次,然后把这些帧保存在列表中:接下来的课会根据索引选取其中一帧。
挑战
中等从精灵图中裁剪出两帧行走动画。
- 在循环之前,创建
frames:取顶行第 0 列和第 1 列的帧,每帧大小为 24 × 24,再放大 3 倍。 - 不要绘制整张精灵图,而是在
(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 在线编辑器