You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:03:49