Pygame游戏使用auto-py-to-exe打包后敌人移动速度异常过快问题求助
问题成因
- 核心原因是你没有为游戏锁定固定帧率,主循环的执行速度完全取决于当前设备的运算负载:IDLE运行时自带调试开销,循环执行速度慢;打包为exe后没有调试负担,循环每秒执行次数大幅提升,敌人每帧都会移动,就会出现速度异常变快的情况。添加print语句会产生IO开销拖慢循环速度,调整屏幕尺寸会影响渲染效率,自然也会间接改变循环帧率,最终表现为敌人移动速度受这些操作影响。
- 次要问题是代码结构错误:你将背景移动、碰撞检测等核心游戏逻辑写在了
for event in pygame.event.get()的事件遍历循环内部,只有当系统产生事件(比如按键、窗口操作)时,这部分逻辑才会执行,无事件时逻辑不运行,进一步加剧了移动速度的不稳定。
修复方案
- 新增帧率控制逻辑
在pygame.init()之后创建时钟对象:
clock = pygame.time.Clock()
在主循环末尾pygame.display.flip()之后添加锁帧代码,固定为每秒60帧:
clock.tick(60)
锁定帧率后,无论运行环境如何,主循环每秒都会固定执行60次,敌人每帧移动的距离固定,速度就会稳定下来。
- 调整主循环结构
把按键检测、碰撞检测、背景/精灵移动的逻辑从事件遍历循环中挪出来,主循环遵循「处理事件→更新游戏逻辑→渲染画面」的标准结构,示例调整如下:
while 1: keys=pygame.key.get_pressed() # 第一步:处理所有事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.mixer.music.stop() sys.exit() if event.type==pygame.KEYUP: x+=1 bgspd=[0,0] # 第二步:处理游戏逻辑(移到事件循环外面) if bgrect.colliderect(ashrect): if keys[pygame.K_d]: bgspd=[10,0] bgrect.move_ip([-10,0]) pokerect.move_ip([-10,0]) player.fill((0,0,0)) x,y=-1,-2 # 剩下的w/a/s按键逻辑、精灵球收集、碰撞检测逻辑都挪到这里 else: gameOver() # 敌人移动逻辑保留 en1rect.move_ip(enSpeed(en1rect.x,en1rect.y,ashrect.x,ashrect.y,bgspd)) en2rect.move_ip(enSpeed(en2rect.x,en2rect.y,ashrect.x,ashrect.y,bgspd)) en3rect.move_ip(enSpeed(en3rect.x,en3rect.y,ashrect.x,ashrect.y,bgspd)) # 第三步:渲染画面 screen.blit(bg,bgrect) # 剩下的渲染逻辑保留 pygame.display.flip() # 锁帧 clock.tick(60)
- 补充遗漏的代码定义
你当前代码中使用的字体对象ft、游戏结束函数gameOver()均未定义,运行时会触发报错,需要补充对应的定义代码。
内容的提问来源于stack exchange,提问作者Danish
相关产品推荐
相关产品推荐

