Menu
CoddyTech

从原始图像开始旋转

本课属于 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,清晰度也不会比旋转一次后的图片更低。这个规则适用于所有变换:始终基于原图处理,而不是基于上一份副本。

challenge icon

挑战

中等

旋转尖刺球,但不要让它变大。

  1. 在循环之前,设置 angle = 0。每一帧都给它加上 2。
  2. 将原始的 ball 旋转 angle,并将结果绘制在中心位于 (320, 240) 的位置。
  3. 不要更改 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()
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

精灵与图像中的所有课

自己练习: Pygame 在线编辑器