如何修复Pygame游戏暂停时定时器仍继续倒计时的Bug
定时器不同步暂停问题修复方案
问题原因
你使用pygame.time.set_timer触发的USEREVENT属于系统级事件,无论游戏逻辑是否暂停,只要定时器处于激活状态,事件就会持续加入事件队列。当前代码的事件处理逻辑没有区分暂停状态,暂停期间生成的所有减计数事件都会被缓存,取消暂停后第一次遍历事件队列时会一次性执行所有缓存的减计数事件,最终出现时间直接跳变、甚至直接结束的问题。
修复方案
可以选择以下任意一种方案实现,也可以叠加使用提升稳定性:
方案1:事件过滤(改动最小)
在事件遍历逻辑最前端增加暂停状态判断,暂停状态下仅处理退出和切换暂停的事件,其余事件(包括定时器事件、操作按键事件)直接丢弃,代码修改如下:
while run: for event in pygame.event.get(): # 新增:暂停状态仅保留必要事件处理 if paused: if event.type == pygame.QUIT: run = False elif event.type == pygame.KEYDOWN and event.key == pygame.K_p: paused = not paused # 其他事件直接跳过,不进入后续处理逻辑 continue # 原有事件处理逻辑保持不变 if event.type == pygame.USEREVENT: counter -= 1 text = str(counter).rjust(3) if counter > 0 else 'GAME OVER!' if event.type == pygame.QUIT: run = False #pause game elif event.type == pygame.KEYDOWN: if event.key == pygame.K_p: paused = not paused #check if key is down if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: run = False if event.key == pygame.K_a: player.movingLeft = True if event.key == pygame.K_d: player.movingRight = True if event.key == pygame.K_SPACE: player.shoot() shoot = True #check if key is up if event.type == pygame.KEYUP: if event.key == pygame.K_a: player.movingLeft = False if event.key == pygame.K_d: player.movingRight = False # 原有剩余逻辑保持不变 if paused: continue # draw street screen.blit(bg, [0, 0]) # ... 其余原有代码不变
方案2:启停定时器(更严谨,无冗余事件)
切换暂停状态时直接控制定时器的启停,从源头避免暂停期间生成多余的定时器事件,仅需要修改P键的处理逻辑即可:
if event.type == pygame.KEYDOWN: if event.key == pygame.K_p: paused = not paused if paused: # 暂停时关闭定时器 pygame.time.set_timer(pygame.USEREVENT, 0) else: # 恢复时重新开启定时器,1000为你原设定的触发间隔(单位毫秒) pygame.time.set_timer(pygame.USEREVENT, 1000)
内容的提问来源于stack exchange,提问作者J.R. BEATS
相关产品推荐
相关产品推荐

