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
相关产品推荐
相关产品推荐

