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

