-- ========================================
-- 变强提升系统模块
-- 功能:管理游戏中的变强提升UI界面,包括按钮显示、列表刷新、位置调整等
-- ========================================
BeStrongUp = {}
-- 加载变强提升气泡配置文件
BeStrongUp.config = ssrRequireCsvCfg("cfg_TiShengQiPao")
-- ========================================
-- 主初始化函数
-- 功能:初始化变强提升UI界面,设置按钮事件和界面状态
-- ========================================
function BeStrongUp.main()
-- 获取父容器
local parent = GUI:Attach_Parent()
-- 加载变强提升UI导出文件
GUI:LoadExport(parent, "be_strong/be_strong_up")
-- 获取UI控件代理
BeStrongUp._ui = GUI:ui_delegate(parent)
-- 为提升按钮添加点击事件
GUI:addOnClickEvent(BeStrongUp._ui["Button_up"], function ()
-- 获取背景面板
local panelBg = BeStrongUp._ui["Panel_bg"]
-- 获取当前显示状态
local isShow = GUI:getVisible(panelBg)
-- 切换显示状态(显示/隐藏)
GUI:setVisible(panelBg, not isShow)
-- 刷新变强列表内容
BeStrongUp.refreshBeStrongList()
end)
-- 初始状态隐藏背景面板
GUI:setVisible(BeStrongUp._ui["Panel_bg"], false)
-- 启动按钮动画效果
BeStrongUp.showBtnAction()
-- 刷新按钮位置
BeStrongUp.refreshBtnPos()
-- 注册相关事件监听
BeStrongUp.RegisterEvent()
end
-- ========================================
-- 关闭函数
-- 功能:清理资源,移除事件监听
-- ========================================
function BeStrongUp.close()
-- 移除事件监听
BeStrongUp.RemoveEvent()
end
-- ========================================
-- 提升按钮动画效果
-- 功能:为提升按钮添加呼吸灯效果(透明度变化动画)
-- ========================================
function BeStrongUp.showBtnAction()
-- 获取提升按钮控件
local btn_up = BeStrongUp._ui["Button_up"]
-- 创建动画序列:淡出到125透明度(0.4秒) -> 淡入到255透明度(0.4秒) -> 延迟0.6秒 -> 无限循环
local action = GUI:ActionRepeatForever(GUI:ActionSequence(GUI:ActionFadeTo(0.4, 125), GUI:ActionFadeTo(0.4, 255), GUI:DelayTime(0.6)))
-- 执行动画
GUI:runAction(btn_up, action)
end
-- ========================================
-- 提升按钮位置刷新
-- 功能:根据宠物状态和窗口模式动态调整按钮和背景面板的位置
-- ========================================
function BeStrongUp.refreshBtnPos()
local posBtn = nil -- 按钮位置
local posBg = nil -- 背景面板位置
-- 获取宠物存活状态
local isAlived = SL:GetMetaValue("PET_ALIVE")
-- 获取窗口模式状态
local isWinMode = SL:GetMetaValue("WINPLAYMODE")
-- 根据宠物状态和窗口模式设置不同的位置
if isAlived then
-- 宠物存活时的位置(需要为宠物UI预留空间)
posBtn = isWinMode and {x = -370, y = 400} or {x = -370, y = 300}
posBg = isWinMode and {x = -370 - 65, y = 400 + 30} or {x = -370 - 65, y = 300 + 30}
else
-- 宠物不存活时的位置(可以更靠近中心)
posBtn = isWinMode and {x = -300, y = 400} or {x = -300, y = 300}
posBg = isWinMode and {x = -300 - 65, y = 400 + 30} or {x = -300 - 65, y = 300 + 30}
end
-- 应用位置设置
GUI:setPosition(BeStrongUp._ui["Button_up"], posBtn.x, posBtn.y)
GUI:setPosition(BeStrongUp._ui["Panel_bg"], posBg.x, posBg.y)
end
-- ========================================
-- 创建列表项按钮
-- 参数:i - 索引,data - 数据对象
-- 返回:创建的按钮控件
-- 功能:为变强列表创建单个按钮项
-- ========================================
function BeStrongUp.createCellBtn(i, data)
-- 创建临时容器控件
local widget = GUI:Widget_Create(-1, "widget_" .. i, 0, 0, 0, 0)
-- 加载按钮单元格UI模板
GUI:LoadExport(widget, "be_strong/be_strong_up_cell")
-- 获取按钮控件
local btn = GUI:getChildByName(widget, "Button_cell")
-- 设置按钮文本为数据名称
GUI:Button_setTitleText(btn, data.name)
-- 从临时容器中移除按钮(避免内存泄漏)
GUI:removeFromParent(btn)
return btn
end
-- ========================================
-- 删除重复项函数
-- 参数:table - 输入的数据表
-- 返回:去重后的数据表
-- 功能:根据name字段去除重复的条目
-- ========================================
function BeStrongUp.removeDuplicates(table)
local seen = {} -- 记录已见过的name
local result = {} -- 结果表
-- 遍历输入表
for key, entry in pairs(table) do
-- 如果该name未出现过
if not seen[entry.name] then
-- 添加到结果表
result[key] = entry
-- 标记为已见过
seen[entry.name] = true
end
end
return result
end
-- ========================================
-- 显示变强列表
-- 功能:刷新变强提升列表的显示内容,包括按钮创建、事件绑定、尺寸调整
-- ========================================
function BeStrongUp.refreshBeStrongList()
-- 获取变强数据
local getData = SL:GetMetaValue("BESTRONG_DATA")
-- 去除重复项
local data = BeStrongUp.removeDuplicates(getData)
-- 计算数据条目数量
local nums = table.nums(data)
-- 如果没有数据则直接返回
if nums == 0 then
return
end
-- 获取UI控件
local panel = BeStrongUp._ui["Panel_bg"] -- 背景面板
local listview = BeStrongUp._ui["ListView"] -- 列表视图
-- 清空现有列表项
GUI:ListView_removeAllItems(listview)
local btnSize = nil -- 按钮尺寸(用于后续计算)
-- 遍历数据创建按钮
for i, v in pairs(data) do
-- 创建按钮
local btn = BeStrongUp.createCellBtn(i, v)
-- 添加到列表视图
GUI:ListView_pushBackCustomItem(listview, btn)
-- 为按钮添加点击事件
GUI:addOnClickEvent(btn, function()
-- 点击后隐藏面板
GUI:setVisible(panel, false)
-- 如果有链接配置
if v.link then
-- 分割链接字符串
local linkSplit = string.split(v.link,",")
-- 获取对应配置
local cfg = BeStrongUp.config[v.link]
if cfg then
-- 打开对应UI界面
-- SL:dump(ssrObjCfg[cfg.uiLink], "ssrObjCfg[cfg.uiLink]", 3)
ssrUIManager:OPEN(ssrObjCfg[cfg.uiLink], linkSplit[2])
end
-- 提交行为统计
SL:SubmitAct({Act = v.link, subid = v.id})
-- 如果有函数配置
elseif v.func then
-- 执行对应函数
v.func()
end
end)
-- 记录第一个按钮的尺寸用于计算
if not btnSize then
btnSize = GUI:getContentSize(btn)
end
end
-- 获取列表项数量
local count = GUI:ListView_getItemCount(listview)
-- 设置默认按钮尺寸(如果获取失败)
local btnSize = btnSize or {width = 120, height = 40}
-- 获取当前面板和列表尺寸
local bgSize = GUI:getContentSize(panel)
local listSize = GUI:getContentSize(listview)
-- 获取列表项间距
local margin = GUI:ListView_getItemsMargin(listview)
-- 计算列表高度:最多显示4.5条,超过的可以滑动显示
local height = (btnSize.height + margin) * math.min(count, 4.5) - margin
-- 设置列表视图尺寸
GUI:setContentSize(listview, listSize.width, height)
-- 设置背景面板尺寸(高度+10像素边距)
GUI:setContentSize(panel, bgSize.width, height + 10)
end
-- ========================================
-- 事件注册管理
-- ========================================
-- 注册事件监听
function BeStrongUp.RegisterEvent()
-- 注册变强位置刷新事件,当需要刷新按钮位置时会触发
SL:RegisterLUAEvent(LUA_EVENT_BESTRONG_POS_REFRESH, "BeStrongUp", BeStrongUp.refreshBtnPos)
end
-- 移除事件监听
function BeStrongUp.RemoveEvent()
-- 取消注册变强位置刷新事件
SL:UnRegisterLUAEvent(LUA_EVENT_BESTRONG_POS_REFRESH, "BeStrongUp")
end