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

Godot离线挂机每2分钟赚$3功能异常求助

问题排查与解决方案

核心问题分析

  1. 领取收益后未同步更新存档时间戳:点击领取按钮时仅更新现金数值,未将当前时间写入user_lastplayed配置项,重启游戏后读取旧时间戳会重复计算已领取的收益,导致按钮显示旧金额。
  2. 修改后的_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:23:12