# TimeManager.gd # 负责驱动游戏内时间的流逝。 # 使用 Timer 节点每秒触发一次时间推进逻辑。 # 从 GameState 读取暂停状态和当前时间,并将更新后的时间写回 GameState。 extends Node # Timer 节点,用于定时触发时间更新 var _day_timer: Timer # 时间单位常量 (可选,但有助于提高可读性) const SECONDS_PER_DAY: float = 1.0 const DAYS_PER_WEEK: int = 7 const WEEKS_PER_MONTH: int = 4 const MONTHS_PER_YEAR: int = 12 func _ready() -> void: print("TimeManager: Initializing...") # 1. 创建并配置 Timer 节点 _day_timer = Timer.new() _day_timer.name = "DayTimer" # 给节点一个名字,方便调试 _day_timer.wait_time = SECONDS_PER_DAY _day_timer.one_shot = false # 需要重复触发 # 2. 连接 timeout 信号到处理函数 # 使用 Callable 进行连接,这是 Godot 4 的推荐方式 var callable_on_timeout = Callable(self, "_on_day_timer_timeout") if not _day_timer.is_connected("timeout", callable_on_timeout): _day_timer.connect("timeout", callable_on_timeout) # 3. 将 Timer 添加为子节点 add_child(_day_timer) # 4. 启动 Timer (也可以设置 autostart = true) _day_timer.start() print("TimeManager: Day timer started (", SECONDS_PER_DAY, "s per day).") # Timer 超时处理函数,每秒调用一次 func _on_day_timer_timeout() -> void: # 检查游戏是否暂停 # 直接访问 Autoload GameState if GameState.is_game_paused(): # print("TimeManager: Game paused, skipping time update.") # 可以取消注释用于调试 return # 如果暂停,则不执行任何操作 # --- 时间推进逻辑 --- # 1. 从 GameState 获取当前时间 var current_time: Dictionary = GameState.get_value("time") # 安全检查:确保获取到的是字典类型 if typeof(current_time) != TYPE_DICTIONARY or current_time.is_empty(): printerr("TimeManager: Error - Could not get valid time data from GameState. Current value: ", current_time) # 考虑是否停止 Timer 或进行其他错误处理 _day_timer.stop() printerr("TimeManager: Timer stopped due to invalid time data.") return # 2. 复制当前时间字典,避免直接修改 GameState 中的数据 var new_time: Dictionary = current_time.duplicate(true) # 使用深拷贝 # 3. 执行时间进阶计算 new_time["day"] += 1 if new_time["day"] > DAYS_PER_WEEK: new_time["day"] = 1 new_time["week"] += 1 if new_time["week"] > WEEKS_PER_MONTH: new_time["week"] = 1 new_time["month"] += 1 if new_time["month"] > MONTHS_PER_YEAR: new_time["month"] = 1 new_time["year"] += 1 print("TimeManager: Happy New Year! Year:", new_time["year"]) # 新年提示 # 4. 将更新后的时间写回 GameState # GameState 的 set_value 会处理信号发射 (state_value_changed, date_changed) GameState.set_value("time", new_time) # print("TimeManager: Time updated - ", new_time) # 可以取消注释用于调试 # --- 公共接口 (可选) --- # 如果需要从外部控制 Timer (例如,调试或特定事件) # func pause_time(): # _day_timer.paused = true # # func resume_time(): # _day_timer.paused = false # # func set_time_scale(scale: float): # # 注意:直接修改 wait_time 会在当前周期结束后生效 # # 更复杂的倍速可能需要不同的实现方式 (例如 _process 累积 delta * scale) # if scale > 0: # _day_timer.wait_time = SECONDS_PER_DAY / scale # else: # printerr("TimeManager: Time scale must be positive.")