(二)Surface、坐标、颜色与绘制次序
1. Surface 保存一块图像
screen 是与窗口关联的 Surface,普通 Surface 也可以在内存里保存图像。可以先在小图上绘制,再用 blit 把它复制到画布:
# 项目文件:demos/surface_pixels.py
# Surface 保存像素;后画的红色矩形覆盖较早的青色矩形,blit 再复制到画布。
import pygame
canvas = pygame.Surface((100, 80))
canvas.fill("white")
tile = pygame.Surface((40, 30), pygame.SRCALPHA)
pygame.draw.rect(tile, "#087F82", (0, 0, 40, 30))
pygame.draw.rect(tile, "#AC4964", (10, 10, 20, 20))
canvas.blit(tile, (20, 15))
print(tuple(canvas.get_at((20, 15)))[:3])
print(tuple(canvas.get_at((35, 30)))[:3])
print(tuple(canvas.get_at((0, 0)))[:3])输出三个 RGB 值:(8, 127, 130)、(172, 73, 100)、(255, 255, 255)。小图先画青色,再在其中画玫红色;重叠区域留下后画的颜色。blit 的 (20, 15) 把小图左上角放到画布的这个位置,并不改变小图本身。
SRCALPHA 让 Surface 保存逐像素透明度。颜色可以用 RGB/RGBA 元组,也可以用代码中的十六进制文本;透明部分在合成时让下面的画面继续显示。Surface 与 blit
2. 屏幕坐标与每帧重画
窗口左上角为 (0, 0),x 向右增加,y 向下增加。第一段代码中的矩形 (60, 140, 48, 36) 分别表示左上角 x、y 和宽、高。
如果只在新位置再画一次方块,旧位置的像素还留在 screen 中,就会看到拖影。清屏后重新画背景、对象与界面,可以让这一帧只反映当前状态。顺序也影响遮挡:先画背景,再画障碍和玩家,最后画分数与菜单。