-- ========================================
-- 变强提升系统模块
-- 功能:管理游戏中的变强提升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
变强气泡
配置文件
local config = {
["@qipao_teshuhecheng,1"] = {
uiLink = "TeShuHeCheng",
},
["@qipao_teshuhecheng,2"] = {
uiLink = "TeShuHeCheng",
},
["@qipao_teshuhecheng,3"] = {
uiLink = "TeShuHeCheng",
},
["@qipao_teshuhecheng,4"] = {
uiLink = "TeShuHeCheng",
},
["@qipao_teshuhecheng,5"] = {
uiLink = "TeShuHeCheng",
},
["@qipao_tizhixiulian"] = {
uiLink = "TiZhiXiuLian",
},
["@qipao_shizhuanghecheng"] = {
uiLink = "ShiZhuangHeCheng",
},
["@qipao_jifengkeyin"] = {
uiLink = "BaoFengZhiLi",
},
["@qipao_shalukeyin"] = {
uiLink = "ShaLuYinJi",
},
["@qipao_xiaojiuguan"] = {
uiLink = "JiuXianLiBai",
},
["@qipao_jianjiacuilian"] = {
uiLink = "ZhuangBeiDuanZao",
},
["@qipao_jinengqianghua"] = {
uiLink = "JiNengQiangHua",
},
["@qipao_kongjianfashi"] = {
uiLink = "KongJianFaShi",
},
["@qipao_jianghuchenghao"] = {
uiLink = "JiangHuChengHao",
},
["@qipao_xiuxian"] = {
uiLink = "XiuXian",
},
["@qipao_bianguanchenghao"] = {
uiLink = "BianGuanTitle",
},
["@qipao_zhuangbeiqianghua"] = {
uiLink = "ZhuangBeiQiangHua",
},
["@qipao_hunyuangongfa"] = {
uiLink = "HunYuanGongFa",
},
["@qipao_shenmozhiti"] = {
uiLink = "ShenMoZhiTi",
},
}
return config
local ssrUIManager = {}
local _layers
local function _get_objcfg_by_id(objid)
for _, objcfg in pairs(ssrObjCfg) do
if objcfg.ID == objid then
return objcfg
end
end
end
function ssrUIManager:INIT()
_layers = {}
for objname, objcfg in pairs(ssrObjCfg) do
if objcfg.OBJ_PATH and objcfg.ID then
local obj
--加载模块错误处理,防止模块内出错,影响其他模块执行!!!
local status, result = pcall(function()
obj = SL:Require(objcfg.OBJ_PATH,true)
end)
if not status then
SL:release_print("----加载模块发生错误----")
SL:release_print(result)
SL:release_print("----加载模块发生错误----")
end
_layers[objcfg.ID] = obj
--网络消息
if objcfg.NET_MESSAGE then
ssrMessage:RegisterNetMsg(objcfg.NET_MESSAGE, obj)
end
end
if objcfg.OBJ_ORDER then
for _,page_objcfg in ipairs(objcfg.OBJ_ORDER) do
page_objcfg.PAGING_OBJ = objcfg
end
end
end
return self
end
-- "ssrObjCfg[cfg.uiLink]" = {
-- "ID" = 65100
-- "NET_MESSAGE" = "TeShuHeCheng"
-- "OBJ_PATH" = "GUILayout/A/TeShuHeChengOBJ"
-- "UI_PATH" = "A/TeShuHeChengUI"
-- }
function ssrUIManager:OPEN(objcfg, data, onClose)
if type(objcfg) == "table" and _layers[objcfg.ID] then
if onClose == true then
if GUI:GetWindow(nil,_layers[objcfg.ID].__cname) then
GUI:Win_CloseByID(_layers[objcfg.ID].__cname)
return
end
end
--有分页的情况
local pageobj = objcfg.PAGING_OBJ
if pageobj then
--判断父窗口是否打开
local pageui = GUI:GetWindow(nil,_layers[pageobj.ID].__cname)
if pageui then
--父窗口快速化
local parent_ui = GUI:ui_delegate(pageui)
--创建子页签
_layers[objcfg.ID]:main(objcfg,data,parent_ui)
else
--未打开则去创建
_layers[pageobj.ID]:main(pageobj,data,_layers[objcfg.ID],objcfg)
return
end
else
--没有分页的情况
_layers[objcfg.ID]:main(objcfg,data)
end
else
--未在OBJCfg中注册,尝试作为系统窗口打开
SL:JumpTo(objcfg)
end
end
function ssrUIManager:CLOSE(objcfg, data)
if _layers[objcfg.ID] then
if GUI:GetWindow(nil,_layers[objcfg.ID].__cname) then
GUI:Win_CloseByID(_layers[objcfg.ID].__cname)
end
end
return _layers[objcfg.ID]
end
function ssrUIManager:GET(objcfg)
return _layers[objcfg.ID]
end
function ssrUIManager:GETBYID(objid)
local objcfg = _get_objcfg_by_id(objid)
return _layers[objid],objcfg
end
function ssrUIManager:OPENBYID(objid)
local obj, objcfg = ssrUIManager:GETBYID(objid)
ssrUIManager:OPEN(objcfg)
end
return ssrUIManager