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

如何从另一个Pygame Surface的局部区域创建新Surface

这事儿好办!你要的局部更新+背景恢复需求,用「提前保存目标区域原始背景+局部刷新」的思路就能完美解决,完全不用全屏刷新。我给你拆解步骤加代码示例,一看就懂:

核心思路

核心就是提前把时钟所在区域的原始背景单独存下来,每次更新时钟时,先把这个保存的背景贴回去覆盖旧时钟,再绘制新时间,最后只刷新这个小区域,而不是整个屏幕。

具体实现步骤
  • 第一步:提前捕获并保存时钟区域的原始背景
    首先得确定时钟的位置和大小(用矩形区域来定义),然后从背景图里把这块区域截出来存成一个独立的Surface。注意别用引用式的截取方法,因为它会跟着原背景变化——我们要的是固定的原始背景,所以用复制的方式:

    # 假设你已经加载了背景图并初始化了显示窗口
    background = pygame.image.load("background.jpg").convert()
    screen = pygame.display.set_mode(background.get_size())
    screen.blit(background, (0, 0))
    
    # 定义时钟区域的位置和尺寸:x坐标, y坐标, 宽度, 高度
    clock_rect = pygame.Rect(200, 50, 250, 80)
    # 创建一个和时钟区域一样大的空Surface
    original_clock_bg = pygame.Surface(clock_rect.size)
    # 把背景图里的时钟区域复制到这个空Surface里
    original_clock_bg.blit(background, (0, 0), clock_rect)
    
  • 第二步:每次更新时钟的操作流程
    在主循环里,当时间变化需要更新时钟时,按以下顺序操作:

    1. 把保存的原始背景贴回屏幕的时钟位置,覆盖掉旧的时钟文本
    2. 渲染新的时钟文本
    3. 把新文本贴到时钟区域(可以调整位置让文本居中)
    4. 只刷新时钟这个局部区域,用局部更新代替全屏刷新

    代码示例:

    # 初始化字体
    font = pygame.font.SysFont(None, 60)
    
    running = True
    last_time_str = ""
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    
        # 获取当前时间并格式化为字符串
        current_time = pygame.time.get_ticks() // 1000  # 示例:以秒为单位的时间
        current_time_str = f"Current Time: {current_time}"
    
        # 只有时间变化时才更新,避免无效操作
        if current_time_str != last_time_str:
            # 1. 恢复时钟区域的原始背景
            screen.blit(original_clock_bg, clock_rect.topleft)
            # 2. 渲染新的时间文本
            text_surface = font.render(current_time_str, True, (255, 255, 255))  # 白色文本
            # 3. 让文本在时钟区域居中显示
            text_rect = text_surface.get_rect(center=clock_rect.center)
            screen.blit(text_surface, text_rect)
            # 4. 局部刷新时钟区域
            pygame.display.update(clock_rect)
            last_time_str = current_time_str
    
注意事项
  • 如果你的背景是动态变化的(比如有其他元素在实时移动),那提前保存的原始背景就失效了——这时候需要每次更新时钟前,从当前屏幕上重新捕获时钟区域的背景,再贴回去覆盖旧时钟。
  • 局部刷新比全屏刷新高效太多,尤其是屏幕尺寸较大时,能明显提升程序运行的流畅度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:02:46