如何在PyGame Zero中绘制透明矩形用于游戏碰撞地图
PyGame Zero 透明矩形绘制解决方案
核心原因
PyGame Zero 内置的screen.draw绘图族和标准PyGame接口逻辑不同:直接传入带alpha通道的四元组RGBA颜色值不会触发透明渲染,rect()、filled_rect()两个内置方法默认不处理透明通道,照搬标准PyGame的颜色传参方案自然失效。
实现方法
放弃直接调用screen.draw.rect()绘制透明矩形,改用独立透明Surface中转绘制:
- 创建带
SRCALPHA标志的透明Surface,尺寸和目标矩形一致 - 调用标准PyGame的绘图方法在这个独立Surface上绘制带透明度的矩形
- 将绘制完成的Surface通过
blit贴到主屏幕对应位置即可
修改后可直接运行的代码如下:
import pgzrun import pygame TILE_SIZE = 64 TILES_WIDE = 8 TILES_HIGH = 8 WIDTH = TILE_SIZE * TILES_WIDE HEIGHT = TILE_SIZE * TILES_HIGH # 矩形透明度,取值0-255,数值越小越透明,碰撞调试场景推荐设为50-100 RECT_ALPHA = 70 tiles = ["empty", "wall", "water"] mapSheet = [ [0, 1, 1, 1, 1, 1, 1, 0], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 1, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [0, 1, 1, 1, 1, 1, 1, 0] ] def draw(): screen.clear() for rows in range(TILES_HIGH): for cols in range(TILES_WIDE): x = cols * TILE_SIZE y = rows * TILE_SIZE if mapSheet[rows][cols] == 1: # 初始化支持透明通道的画布 tmp_surface = pygame.Surface((TILE_SIZE, TILE_SIZE), pygame.SRCALPHA) # 绘制描边半透明白色矩形,要填充效果就去掉width=1参数 pygame.draw.rect(tmp_surface, (255,255,255, RECT_ALPHA), (0,0,TILE_SIZE,TILE_SIZE), width=1) # 贴到主屏幕对应坐标 screen.blit(tmp_surface, (x, y)) pgzrun.go()
注意点
- 该方案不会影响原有碰撞检测逻辑,矩形的坐标、尺寸和原有写法完全一致
- 如果需要做填充式的半透明碰撞遮罩,删除
pygame.draw.rect调用里的width=1参数即可 - 透明度值可根据实际显示效果自由调整,避免矩形遮挡下层游戏素材
内容的提问来源于stack exchange,提问作者wibbleface
相关产品推荐
相关产品推荐

