Python 现代开发学习笔记

(二)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 中,就会看到拖影。清屏后重新画背景、对象与界面,可以让这一帧只反映当前状态。顺序也影响遮挡:先画背景,再画障碍和玩家,最后画分数与菜单。

屏幕坐标向右向下增加,先清除旧位置再画新位置,每帧由当前状态重新得到画面

笔记正文与全部题解 · Ctrl / ⌘ K