Pygame实现每分钟降低玩家饥饿度,CronTrigger致程序冻结如何解决
问题根因
你之前使用的APScheduler相关调度器会启动独立的阻塞线程或异步事件循环,与Pygame自身的主事件、渲染循环发生资源抢占,要么调度逻辑无法触发,要么直接阻塞主循环导致游戏冻结,这类后端/机器人场景的定时方案并不适配Pygame的运行机制。
最优解决方案:使用Pygame原生事件定时机制
这是最适配Pygame生态的方案,无需引入额外依赖,不会产生循环冲突。
首先自定义专属事件,设置定时触发间隔,再在主事件循环中监听事件执行属性更新逻辑即可,示例代码如下:
import pygame # 初始化Pygame pygame.init() # 1. 自定义饥饿度更新专属事件 HUNGER_UPDATE_EVENT = pygame.USEREVENT + 1 # 2. 设置事件触发间隔:60秒 = 60 * 1000 毫秒 pygame.time.set_timer(HUNGER_UPDATE_EVENT, 60 * 1000) # 你已实现的属性更新函数 def Im_Hungry(): # 你的饥饿度、口渴度下降逻辑 pass # 游戏主循环 running = True while running: # 事件队列处理 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 3. 监听定时事件,触发属性更新 if event.type == HUNGER_UPDATE_EVENT: Im_Hungry() # 其他游戏逻辑、画面渲染代码 # ... pygame.display.update()
如果需要同时处理多个不同间隔的属性更新(比如口渴度每30秒下降一次,饥饿度每60秒下降一次),只需要定义多个不同的自定义事件(USEREVENT + 2、USEREVENT + 3)分别设置间隔即可。
备选方案:时间戳差值判断
如果需要更灵活的动态调整触发间隔,可以在主循环中通过时间戳差值判断是否满足触发条件,示例代码如下:
import pygame import time pygame.init() # 记录上次更新饥饿度的时间戳 last_hunger_update = time.time() # 设置更新间隔为60秒 HUNGER_INTERVAL = 60 def Im_Hungry(): # 你的属性更新逻辑 pass running = True while running: current_time = time.time() # 判断是否达到更新间隔 if current_time - last_hunger_update >= HUNGER_INTERVAL: Im_Hungry() # 重置上次更新时间 last_hunger_update = current_time # 其他事件处理、渲染逻辑 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # ... pygame.display.update()
内容的提问来源于stack exchange,提问作者KermitHQ
相关产品推荐
相关产品推荐

