39传奇素材网 发表于 2025-7-14 17:57:13

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

在 GEE 引擎中,事件触发是更新进度条的高效方式,通过监听游戏内特定事件(如玩家交互、系统状态变化)来动态调整进度条状态。以下是具体实现方法和示例:
一、事件触发机制基础
GEE 引擎提供两类事件触发方式:

内置事件:通过RegisterEvent注册系统预设事件(如怪物击杀、物品使用)
自定义事件:通过TriggerEvent手动触发特定事件

核心命令:

lua
-- 注册事件回调
RegisterEvent("事件名称", "回调函数")

-- 触发自定义事件
TriggerEvent("自定义事件名称", 参数1, 参数2...)
二、进度条更新的典型应用场景
(一)任务进度追踪
监听怪物击杀事件,更新任务进度条:

lua
-- 初始化任务进度条
function InitQuestProgressBar()
    -- 设置进度条最大值(假设需要击杀10只怪物)
    SetCustomItemProgressbarValue 1 0 0 = 10
    SetCustomItemProgressbarValue 1 0 1 = 0-- 初始值为0

    -- 注册怪物击杀事件
    RegisterEvent("OnKillMonster", "UpdateQuestProgress")
end

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

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

      -- 更新显示
      UpdateProgressDisplay()

      -- 检查任务是否完成
      if current >= 10 then
            CompleteQuest()
      end
    end
end

-- 更新进度条显示
function UpdateProgressDisplay()
    local current = GetCustomItemProgressbarValue(1, 0, 1)
    local max = GetCustomItemProgressbarValue(1, 0, 0)

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

    -- 更新图片显示
    SendMsg(2, "[显示图片]630,100,100,0,0")-- 隐藏旧图片
    SendMsg(2, "[显示图片]"..imgId..",100,100,1,0")-- 显示新图片
end
(二)资源采集进度
监听采集动作,更新采集进度条:

lua
-- 初始化采集进度条
function InitGatheringProgressBar()
    SetCustomItemProgressbarValue 1 0 0 = 100-- 最大进度100
    SetCustomItemProgressbarValue 1 0 1 = 0    -- 初始进度0

    -- 注册采集开始事件
    RegisterEvent("OnGatheringStart", "StartGathering")
    -- 注册采集进行事件(每秒触发一次)
    RegisterEvent("OnGatheringUpdate", "UpdateGatheringProgress")
    -- 注册采集结束事件
    RegisterEvent("OnGatheringComplete", "StopGathering")
end

-- 开始采集
function StartGathering(resourceType)
    -- 记录当前采集资源类型
    currentResourceType = resourceType
    -- 显示进度条
    SendMsg(2, "[显示图片]620,100,100,1,0")-- 显示进度条背景
end

-- 更新采集进度
function UpdateGatheringProgress()
    local current = GetCustomItemProgressbarValue(1, 0, 1)
    current = current + 10-- 每次增加10%进度

    SetCustomItemProgressbarValue 1 0 1 = current
    UpdateProgressDisplay()

    -- 采集完成
    if current >= 100 then
      TriggerEvent("OnGatheringComplete", currentResourceType)
    end
end

-- 停止采集
function StopGathering(resourceType)
    -- 隐藏进度条
    SendMsg(2, "[显示图片]620,100,100,0,0")
    -- 重置进度
    SetCustomItemProgressbarValue 1 0 1 = 0
end
(三)玩家交互触发
监听按钮点击或对话选择,更新进度条:

lua
-- 注册按钮点击事件
RegisterButtonEvent("btnIncrease", "OnButtonClick")

-- 按钮点击回调
function OnButtonClick(buttonId)
    if buttonId == "btnIncrease" 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
三、高级事件触发技巧
(一)多事件组合触发
监听多个事件,任一事件触发时更新进度条:

lua
-- 初始化多事件进度条
function InitMultiEventProgressBar()
    SetCustomItemProgressbarValue 1 0 0 = 100
    SetCustomItemProgressbarValue 1 0 1 = 0

    -- 注册多个事件
    RegisterEvent("OnKillMonster", "UpdateMultiProgress")
    RegisterEvent("OnUseItem", "UpdateMultiProgress")
    RegisterEvent("OnLevelUp", "UpdateMultiProgress")
end

-- 统一处理多个事件
function UpdateMultiProgress(eventType, ...)
    local current = GetCustomItemProgressbarValue(1, 0, 1)

    -- 根据不同事件类型增加不同进度
    if eventType == "OnKillMonster" then
      current = current + 5-- 击杀怪物+5%
    elseif eventType == "OnUseItem" then
      current = current + 10-- 使用物品+10%
    elseif eventType == "OnLevelUp" then
      current = current + 20-- 升级+20%
    end

    if current > 100 then current = 100 end

    SetCustomItemProgressbarValue 1 0 1 = current
    UpdateProgressDisplay()
end
(二)自定义事件触发
在特定逻辑点手动触发事件更新进度条:

lua
-- 自定义事件示例
function CustomEventExample()
    -- 注册自定义事件
    RegisterEvent("CustomProgressUpdate", "OnCustomProgressUpdate")

    -- 在某个业务逻辑中触发事件
    function DoSomething()
      -- 模拟业务处理
      local success = ProcessBusinessLogic()

      if success then
            -- 触发自定义事件,传递进度值
            TriggerEvent("CustomProgressUpdate", 30)-- 增加30%进度
      end
    end

    -- 自定义事件回调
    function OnCustomProgressUpdate(progressDelta)
      local current = GetCustomItemProgressbarValue(1, 0, 1)
      current = current + progressDelta
      if current > 100 then current = 100 end

      SetCustomItemProgressbarValue 1 0 1 = current
      UpdateProgressDisplay()
    end
end
四、注意事项与优化建议
事件注册位置:
建议在 Npc 初始化脚本或全局初始化脚本中注册事件
避免在高频调用的函数中重复注册事件
性能优化:
lua
-- 减少不必要的显示更新(变化超过阈值才刷新)
local lastDisplayValue = -1
function UpdateProgressDisplay()
    local current = GetCustomItemProgressbarValue(1, 0, 1)
    if math.abs(current - lastDisplayValue) >= 5 then-- 变化超过5%才更新
      -- 更新显示逻辑
      lastDisplayValue = current
    end
end

兼容性处理:
lua
-- 检查引擎版本支持
if CheckCommandExists("RegisterEvent") then
    RegisterEvent("OnKillMonster", "UpdateQuestProgress")
else
    -- 旧版本引擎兼容方案
    SendMsg(2, "[注册事件]OnKillMonster,UpdateQuestProgress")
end

内存管理:
在进度条不再使用时,使用UnregisterEvent注销事件回调
lua
function DestroyProgressBar()
    UnregisterEvent("OnKillMonster", "UpdateQuestProgress")
    -- 隐藏进度条
    SendMsg(2, "[显示图片]620,100,100,0,0")
end

五、常见事件类型参考表
事件名称        触发时机        回调参数
OnKillMonster        玩家击杀怪物时        monsterId(怪物 ID)
OnUseItem        玩家使用物品时        itemId(物品 ID)
OnLevelUp        玩家升级时        newLevel(新等级)
OnLogin        玩家登录时        playerId(玩家 ID)
OnLogout        玩家登出时        playerId(玩家 ID)
OnChat        玩家发送聊天消息时        playerId, message, channel
OnButtonClick        玩家点击 UI 按钮时        buttonId(按钮 ID)
OnNpcDialogSelect        玩家选择 Npc 对话选项时        dialogId(对话 ID)

通过合理利用事件触发机制,你可以在 GEE 引擎中实现高度灵活的进度条系统,实时响应玩家行为和游戏状态变化,提升用户体验。

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