39传奇素材网 发表于 2025-7-14 17:55:12

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


在 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 + 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 引擎可实现从简单进度条到复杂状态显示系统的全方位支持。开发时建议优先使用事件驱动模式,减少不必要的定时器开销,并通过内存池复用临时对象提升性能。

页: [1]
查看完整版本: 如何在GEE引擎中使用定时器或事件触发来更新进度条的显示状态