从原始图像开始旋转
本课属于 Coddy Pygame 学习旅程的“精灵与图像”单元。第 9 课,共 39 课。
一个一直旋转的尖刺球每帧都会转动一点。下面这种写法看起来很诱人,但会出问题:
ball = pygame.transform.rotate(ball, 2) # 错误每一帧都会旋转上一帧旋转后的图片。每次旋转都会增加一圈透明边框,因此 Surface 每帧会增大约 3 percent:半秒后尺寸变为两倍,两秒后宽度将接近 1,800 pixels。每次旋转还会让像素变得更模糊一些。游戏很快就会慢得几乎无法运行。
保留原图和角度,并在每一帧都根据原图生成旋转后的图片:
angle += 2
spun = pygame.transform.rotate(ball, angle)
screen.blit(spun, spun.get_rect(center=(320, 240)))现在,无论角度是多少,spun 都只比文件中的原图多旋转了一次:尺寸不会超过 67 by 67 pixels,清晰度也不会比旋转一次后的图片更低。这个规则适用于所有变换:始终基于原图处理,而不是基于上一份副本。
挑战
中等旋转尖刺球,但不要让它变大。
- 在循环之前,设置
angle = 0。每一帧都给它加上 2。 - 将原始的
ball旋转angle,并将结果绘制在中心位于(320, 240)的位置。 - 不要更改
ball本身。
按下“开始”:尖刺球会旋转,并保持大小不变。然后点击“检查”。
亲手试试
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Spinning Spikes")
clock = pygame.time.Clock()
ball = pygame.image.load("assets/images/spike_ball.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(ball, ball.get_rect(center=(320, 240)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
精灵与图像中的所有课
自己练习: Pygame 在线编辑器