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

pygame执行blit操作后图像无法永久显示在surface上问题求助

问题根因
  • 没有引入状态标记过场是否结束:你当前的新场景绘制逻辑仅在按下回车的那一帧执行,下一轮主循环运行时,代码还是会按realtime的判断执行原有过场的绘制逻辑,直接覆盖了你上一帧绘制的新场景,所以只会闪一下就回到原过场画面。
  • 主循环内重复调用pygame.event.get():该方法调用后会清空事件队列,你第一次调用只处理了退出事件,剩下的事件直接被丢弃,第二次调用能拿到的事件是不完整的,会导致按键响应偶尔失效。
  • 错误使用time.sleep(9):该方法会阻塞整个主线程,期间画面不会更新、事件不会响应,完全不符合pygame主循环的设计逻辑。
修复方案
  1. 在主循环外新增状态变量cutscene_ended = False,用来标记过场动画是否已经完成,玩家按下回车后就把该变量设为True。
  2. 合并两次事件处理逻辑,所有事件都在同一个pygame.event.get()循环里处理。
  3. 删掉time.sleep(9),音效只要播放一次就行,不需要加sleep等待播放完成。
  4. 主循环最优先判断cutscene_ended的状态,如果为True就直接绘制新场景,跳过所有过场相关的绘制逻辑。
修改后的代码示例
running = True
cutscene_ended = False  # 新增过场状态标记
sound_played = False # 新增音效播放标记,避免重复播放
while running:
    screen.fill((211, 211, 211))
    alphaval -= 20

    # 合并事件处理逻辑
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        if event.type == pygame.KEYDOWN and realtime >= 14 and not cutscene_ended:
            if event.key == pygame.K_RETURN:
                cutscene_ended = True # 标记过场结束

    realtime = pygame.time.get_ticks()/1000

    # 过场已结束,直接绘制新场景,跳过后面的过场逻辑
    if cutscene_ended:
        screen.blit(frame_0, (0, 0))
        pygame.draw.rect(screen, (0, 0, 0), (0, 0, 320, 480), 15)
        screen.blit(frameE_0, (320, 0))
        pygame.draw.rect(screen, (0, 0, 0), (320, 0, 320, 480), 15)
    else:
        # 原有过场绘制逻辑
        screen.blit(frame_0, (0, 0))
        pygame.draw.rect(screen, (0, 0, 0), (0, 0, 320, 480), 15)
        if realtime >= 1:
            loading(337, 99)
        fadein()
        if 3 <= realtime <=9 and not sound_played:
            channel1.play(pygame.mixer.Sound(r'missions\call.ogg'))
            sound_played = True
        elif realtime >= 9:
            screen.blit(frameE_0, (320, 0))
            pygame.draw.rect(screen, (0, 0, 0), (320, 0, 320, 480), 15)
        if realtime >= 12.5:
            screen.blit(dialE, (45, 300))
            textbox("hello?", 65, 340)
        if realtime >= 14:
            textbox("who is this?", 125, 340)

    clock.tick(30)
    pygame.display.update()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:24:05