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

PyGame中如何在blit后选择性重置单个已绘制Surface的显示?

PyGame 选择性重置已绘制的Surface问题

我创建了两个绿色Surface:

s1 = Surface((100, 100))
s2 = Surface((100, 100))

s1.fill((0, 255, 0))
s2.fill((0, 255, 0))

随后将它们绘制在带有背景图的主Surface上:

screen.blit(image.load("ocean.png").convert_alpha(), (0, 0))
screen.blit(s1, (0, 100))
screen.blit(s2, (200, 100))

问题

如何在已将Surface绘制到另一Surface后,选择性重置其中一个绿色Surface的显示,使其如同从未被绘制过?

注:尝试过PyGame的set_alpha和set_colorkey方法,但没有效果,也无法实现选择性重置:

screen.set_alpha(0) # 无变化

或

screen.set_colorkey((0, 255, 0)) # 无变化

解决方法

在PyGame中,一旦将Surface绘制到主屏幕(screen)上,两者的像素会直接合并,无法单独“撤销”某个已绘制的Surface。要实现选择性重置,核心思路是重绘目标区域的背景内容,具体可采用以下两种方案:

方案1:提前保存背景对应区域

在绘制绿色Surface之前,先截取背景图中对应位置的区域并保存,后续需要重置时直接把保存的背景区域blit回去:

# 先加载背景图并绘制到屏幕
background = image.load("ocean.png").convert_alpha()
screen.blit(background, (0, 0))

# 保存s1和s2对应的背景区域,格式:(x, y, width, height)
s1_bg = background.subsurface((0, 100, 100, 100))
s2_bg = background.subsurface((200, 100, 100, 100))

# 绘制绿色Surface
screen.blit(s1, (0, 100))
screen.blit(s2, (200, 100))

当需要重置s1时,执行以下代码:

# 把保存的背景区域覆盖回原位置
screen.blit(s1_bg, (0, 100))
# 只更新目标区域,提升效率
pygame.display.update((0, 100, 100, 100))

方案2:帧循环内重绘整个屏幕

如果场景元素不多,可在游戏主循环中,每一帧先重绘整个背景,再重新绘制需要保留的Surface。比如要重置s1,就只绘制s2:

# 主循环内的刷新逻辑
screen.blit(background, (0, 0)) # 重绘整个背景
screen.blit(s2, (200, 100)) # 仅保留需要显示的Surface
pygame.display.flip()

内容的提问来源于stack exchange,提问作者upcast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:15:25