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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 05:12:03