Godot离线挂机每2分钟赚$3功能异常求助
问题排查与解决方案
核心问题分析
- 领取收益后未同步更新存档时间戳:点击领取按钮时仅更新现金数值,未将当前时间写入
user_lastplayed配置项,重启游戏后读取旧时间戳会重复计算已领取的收益,导致按钮显示旧金额。 - 修改后的
_process函数逻辑失效:新增的lastearned是局部变量,修改它不会影响全局的lastplayed,而calculate_cash_earned依赖全局lastplayed计算收益,会持续覆盖手动重置的cashearned=0,导致待领金额无法清零。
修复方案
关键修改点
- 领取收益时同步更新并保存
lastplayed到配置文件 - 恢复
_process中对全局lastplayed的更新逻辑,同时优化实时计算触发逻辑 - 调整
calculate_cash_earned函数,避免直接修改全局变量,改为返回计算结果
修复后的完整代码
extends CharacterBody2D @onready var ClaimCash = $ClaimCash var config = ConfigFile.new() var lastplayed var cashearned = 0 func _ready(): # 加载或初始化用户数据 if config.load("user://user_data.cfg") != OK: # 首次创建配置文件,初始化默认值 config.set_value("user", "user_lastplayed", Time.get_unix_time_from_system()) config.set_value("user", "user_cash", 0) config.save("user://user_data.cfg") lastplayed = config.get_value("user", "user_lastplayed") else: # 补全缺失的配置项 if not config.has_section_key("user", "user_lastplayed"): config.set_value("user", "user_lastplayed", Time.get_unix_time_from_system()) if not config.has_section_key("user", "user_cash"): config.set_value("user", "user_cash", 0) config.save("user://user_data.cfg") lastplayed = config.get_value("user", "user_lastplayed") # 计算离线收益并更新UI cashearned = calculate_cash_earned() ClaimCash.text = str(cashearned) # 更新时间戳,避免重复计算离线收益 config.set_value("user", "user_lastplayed", Time.get_unix_time_from_system()) config.save("user://user_data.cfg") func calculate_cash_earned(): var current_time = Time.get_unix_time_from_system() var elapsed_time = current_time - lastplayed var increments = int(elapsed_time / 120) var earned = increments * 3 # 应用24小时收益上限(21600美元) return min(earned, 21600) func _process(_delta): var current_time = Time.get_unix_time_from_system() # 每满2分钟计算一次实时收益 if current_time - lastplayed >= 120: cashearned = calculate_cash_earned() ClaimCash.text = str(cashearned) # 更新全局时间戳并保存,避免重复计算 lastplayed = current_time config.set_value("user", "user_lastplayed", lastplayed) config.save("user://user_data.cfg") func _on_claim_cash_pressed(): var current_cash = config.get_value("user", "user_cash") var new_cash = current_cash + cashearned config.set_value("user", "user_cash", new_cash) # 核心修复:领取后更新时间戳,防止重启后重复计算 lastplayed = Time.get_unix_time_from_system() config.set_value("user", "user_lastplayed", lastplayed) config.save("user://user_data.cfg") # 重置待领金额并更新UI cashearned = 0 ClaimCash.text = str(cashearned)
额外优化说明
- 初始化时增加
user_cash默认值处理,避免首次启动读取不到现金的异常 calculate_cash_earned改为返回计算结果,不直接修改全局变量,逻辑更清晰_process中更新时间戳后立即保存,避免游戏崩溃导致时间数据丢失
内容的提问来源于stack exchange,提问作者maybe
相关产品推荐
相关产品推荐

