设为首页收藏本站
  • 官方微信
    lmkj_wx 微信公众号 添加方式:
    1:扫描左侧二维码
  • 手机访问
    lmkj_sj
  •  找回密码
     立即注册

    QQ登录

    只需一步,快速开始

    查看: 24|回复: 0

    如何在GEE引擎中使用定时器或事件触发来更新进度条的显示状态

    [复制链接]
    avatar
    • 打卡等级:魔龙套勇士
    • 打卡总天数:131
    • 打卡月天数:24
    • 打卡总奖励:14956
    • 最近打卡:2025-08-24 00:16:44

    7084

    主题

    152

    回帖

    8652

    积分

    管理员

    本站站长

    积分
    8652
    online_admin 发表于 2025-7-14 17:55:12 | 显示全部楼层 |阅读模式

    在 GEE 引擎中,定时器和事件触发是更新进度条状态的核心机制,结合最新引擎特性,以下是具体实现方法和代码示例:
    一、定时器驱动的进度条更新
    1. 基础定时器实现
    使用SetTimer命令周期性触发进度条更新,适合模拟持续增长 / 减少的进度(如资源采集、技能冷却):

    lua
    -- 初始化进度条
    function InitProgressBar()
        -- 设置进度条最大值
        SetCustomItemProgressbarValue 1 0 0 = 100
        -- 初始值设为0
        SetCustomItemProgressbarValue 1 0 1 = 0
        -- 启动定时器,每100ms更新一次
        SetTimer("UpdateProgress", 100)
    end

    -- 定时器回调函数
    function UpdateProgress()
        local current = GetCustomItemProgressbarValue(1, 0, 1)
        current = current + 1  -- 进度值+1

        -- 更新进度条显示
        SetCustomItemProgressbarValue 1 0 1 = current

        -- 计算显示图片编号(假设使用630-639系列图片)
        local imgId = 630 + math.floor(current / 10)
        if imgId > 639 then imgId = 639 end

        -- 更新显示
        SendMsg(2, "[显示图片]630,100,100,0,0")  -- 隐藏旧图片
        SendMsg(2, "[显示图片]"..imgId..",100,100,1,0")  -- 显示新图片

        -- 进度达到100时停止
        if current >= 100 then
            KillTimer("UpdateProgress")
        end
    end


    2. 带加速度的进度条
    lua
    -- 带加速度的进度更新
    function UpdateProgressWithAcceleration()
        local current = GetCustomItemProgressbarValue(1, 0, 1)
        local max = GetCustomItemProgressbarValue(1, 0, 0)

        -- 加速度计算(进度越快增长越快)
        local delta = 1 + math.floor(current / 20)

        current = current + delta
        if current > max then current = max end

        -- 更新进度条
        SetCustomItemProgressbarValue 1 0 1 = current

        -- 计算显示图片编号
        local imgId = 630 + math.floor(current * 9 / max)
        SendMsg(2, "[显示图片]630,100,100,0,0")
        SendMsg(2, "[显示图片]"..imgId..",100,100,1,0")

        if current >= max then
            KillTimer("UpdateProgressWithAcceleration")
        end
    end
    二、事件触发的进度条更新
    1. 基于玩家行为的触发
    lua
    -- 注册点击事件
    RegisterButtonEvent("btnStart", "OnButtonClick")

    -- 按钮点击回调
    function OnButtonClick(buttonId)
        if buttonId == "btnStart" then
            -- 增加进度20%
            local current = GetCustomItemProgressbarValue(1, 0, 1)
            current = current + 20
            if current > 100 then current = 100 end

            -- 更新进度条
            SetCustomItemProgressbarValue 1 0 1 = current
            UpdateProgressDisplay()
        end
    end

    -- 更新进度条显示
    function UpdateProgressDisplay()
        local current = GetCustomItemProgressbarValue(1, 0, 1)
        local imgId = 630 + math.floor(current / 10)
        if imgId > 639 then imgId = 639 end

        SendMsg(2, "[显示图片]630,100,100,0,0")
        SendMsg(2, "[显示图片]"..imgId..",100,100,1,0")
    end
    2. 基于游戏事件的触发
    lua
    -- 注册怪物击杀事件
    RegisterEvent("OnKillMonster", "UpdateQuestProgress")

    -- 事件回调函数
    function UpdateQuestProgress(monsterId)
        -- 判断是否为任务目标怪物
        if monsterId == 1001 then  -- 假设1001是任务怪物ID
            -- 增加进度10%
            local current = GetCustomItemProgressbarValue(1, 0, 1)
            current = current + 10
            if current > 100 then current = 100 end

            SetCustomItemProgressbarValue 1 0 1 = current
            UpdateProgressDisplay()

            -- 进度达到100时触发奖励
            if current >= 100 then
                SendMsg(0, "任务完成!获得奖励:金币*1000")
                GiveItem("金币", 1000)
            end
        end
    end
    三、高级应用:混合触发机制
    1. 限时任务进度条
    lua
    -- 初始化限时任务进度
    function InitTimeLimitedQuest()
        -- 设置进度条(左边显示时间,右边显示任务进度)
        SetCustomItemProgressbarValue 1 0 0 = 300  -- 时间限制5分钟(300秒)
        SetCustomItemProgressbarValue 1 0 1 = 300
        SetCustomItemProgressbarValue 1 1 0 = 100  -- 任务目标100分
        SetCustomItemProgressbarValue 1 1 1 = 0

        -- 启动倒计时
        SetTimer("UpdateTimeProgress", 1000)  -- 每秒更新一次
    end

    -- 更新时间进度
    function UpdateTimeProgress()
        local timeLeft = GetCustomItemProgressbarValue(1, 0, 1)
        timeLeft = timeLeft - 1

        SetCustomItemProgressbarValue 1 0 1 = timeLeft

        -- 更新显示
        UpdateTimeDisplay()

        -- 时间到则检查任务完成情况
        if timeLeft <= 0 then
            KillTimer("UpdateTimeProgress")
            CheckQuestResult()
        end
    end

    -- 更新任务进度(由事件触发)
    function UpdateQuestScore(score)
        local currentScore = GetCustomItemProgressbarValue(1, 1, 1)
        currentScore = currentScore + score
        if currentScore > 100 then currentScore = 100 end

        SetCustomItemProgressbarValue 1 1 1 = currentScore
        UpdateScoreDisplay()
    end
    2. 与角色属性绑定的进度条
    lua
    -- 绑定经验值进度条
    function BindExperienceProgress()
        local exp = GetCharacterData("Experience")
        local nextLevelExp = GetCharacterData("NextLevelExperience")

        -- 设置进度条最大值和当前值
        SetCustomItemProgressbarValue 1 0 0 = nextLevelExp
        SetCustomItemProgressbarValue 1 0 1 = exp

        -- 注册属性变更事件
        RegisterEvent("OnPropertyChanged", "OnExpChanged")
    end

    -- 经验值变更回调
    function OnExpChanged(propertyName, oldValue, newValue)
        if propertyName == "Experience" then
            SetCustomItemProgressbarValue 1 0 1 = newValue
            UpdateExpDisplay()
        end
    end
    四、性能优化与注意事项
    定时器频率控制:
    非实时更新场景建议使用 1 秒以上的间隔(如任务进度)
    高频率更新(如技能冷却)建议控制在 100ms 以上
    显示优化:
    lua
    -- 减少不必要的刷新(值变化超过阈值才更新显示)
    local lastDisplayValue = -1
    function UpdateProgressDisplay()
        local current = GetCustomItemProgressbarValue(1, 0, 1)
        if math.abs(current - lastDisplayValue) >= 5 then  -- 变化超过5才刷新
            -- 更新显示逻辑
            lastDisplayValue = current
        end
    end

    内存管理:
    长时间运行的定时器应在适当时候使用KillTimer销毁
    避免在高频回调函数中创建大量临时变量
    兼容性处理:
    lua
    -- 版本兼容检查
    if CheckCommandExists("SetCustomItemProgressbarValue") then
        -- 使用新命令
        SetCustomItemProgressbarValue 1 0 1 = 50
    else
        -- 旧版本引擎兼容方案
        SendMsg(2, "[设置进度条]1,50")
    end

    五、扩展应用场景
    动态加载条:
    lua
    -- 模拟资源加载
    function SimulateLoading()
        local loadingSteps = {"加载地图数据...", "初始化角色...", "加载音效...", "连接服务器..."}
        local currentStep = 1

        SetCustomItemProgressbarValue 1 0 0 = #loadingSteps * 10
        SetCustomItemProgressbarValue 1 0 1 = 0

        SetTimer("LoadingStep", 500)

        function LoadingStep()
            local current = GetCustomItemProgressbarValue(1, 0, 1)
            current = current + 10

            SetCustomItemProgressbarValue 1 0 1 = current
            SendMsg(0, loadingSteps[currentStep])

            currentStep = currentStep + 1
            if currentStep > #loadingSteps then
                KillTimer("LoadingStep")
                SendMsg(0, "加载完成!")
            end
        end
    end

    技能连招进度条:
    lua
    -- 技能连招进度
    function ComboProgress()
        local comboCount = 0
        local maxCombo = 5

        SetCustomItemProgressbarValue 1 0 0 = maxCombo
        SetCustomItemProgressbarValue 1 0 1 = 0

        -- 注册技能释放事件
        RegisterEvent("OnSkillUse", "OnComboSkill")

        function OnComboSkill(skillId)
            -- 判断是否为连招技能
            if IsComboSkill(skillId) then
                comboCount = comboCount + 1
                if comboCount > maxCombo then comboCount = maxCombo end

                SetCustomItemProgressbarValue 1 0 1 = comboCount

                -- 启动连招计时器(5秒内未释放下一个技能则重置)
                KillTimer("ResetCombo")
                SetTimer("ResetCombo", 5000)
            end
        end

        function ResetCombo()
            comboCount = 0
            SetCustomItemProgressbarValue 1 0 1 = 0
        end
    end


    通过合理组合定时器与事件触发机制,GEE 引擎可实现从简单进度条到复杂状态显示系统的全方位支持。开发时建议优先使用事件驱动模式,减少不必要的定时器开销,并通过内存池复用临时对象提升性能。

    您需要登录后才可以回帖 登录 | 立即注册 qq_login

    本版积分规则

    QQArchiver 手机版 小黑屋 39传奇素材网 ( 蜀ICP备2022016510号-3 )

    快速回复 快速发帖 返回顶部 返回列表