平铺背景
本课属于 Coddy Pygame 学习旅程的“精灵与图像”单元。第 4 课,共 39 课。
单一颜色会让天空显得单调。assets/backgrounds/sky.png 是一张 72 乘 72 的图片,专为重复平铺而制作:把副本并排放置,边缘就能无缝衔接。用一张小图片的多个副本铺满窗口,这叫平铺。
两个循环可以逐行遍历网格中每个左上角的位置:
for x in range(0, 640, 72):
for y in range(0, 480, 72):
screen.blit(tile, (x, y))range(0, 640, 72) 会依次生成 0、72、144 等数值,直到 576。位置为 576 的副本会延伸到 648,超出窗口边缘:pygame 会绘制窗口内的部分,并跳过其余部分,因此最右侧的一列会被整齐地截断。
这些平铺图片会覆盖整个窗口,因此可以替代 screen.fill:先绘制它们,再把其他内容绘制在上面。这张图片没有透明像素,所以用 .convert() 加载。它是用于不透明图片的 convert_alpha() 版本。
挑战
简单用天空图块铺满窗口。
- 在
set_mode之后,使用.convert()加载assets/backgrounds/sky.png,并将其存入tile。 - 用两个循环替换
screen.fill(...),在每个(x, y)位置绘制tile,其中 x 遍历range(0, 640, 72),y 遍历range(0, 480, 72)。 - 在绘制图块之后继续绘制飞船。
按“开始”:飞船后面会出现铺满图块的天空。然后按“检查”。
亲手试试
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Sky Tiles")
clock = pygame.time.Clock()
ship = pygame.image.load("assets/images/ship.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(ship, (288, 360))
pygame.display.flip()
clock.tick(60)
pygame.quit()
精灵与图像中的所有课
自己练习: Pygame 在线编辑器