local TianMingOBJ = {}
TianMingOBJ.__cname = "TianMingOBJ"
--TianMingOBJ.config = ssrRequireCsvCfg("cfg_TianMing")
TianMingOBJ.radiusLeft = 400
TianMingOBJ.radiusRight = -400
TianMingOBJ.LeftUnLock = {
"60级解锁",
"80级解锁",
"100级解锁",
"120级解锁",
"180级解锁",
"240级解锁",
"1转解锁",
"2转解锁",
"3转解锁",
"4转解锁",
"5转解锁",
"6转解锁",
}
TianMingOBJ.RightUnLock = {
"后天造化箓*10",
"后天造化箓*10",
"后天造化箓*10",
"后天造化箓*10",
"后天造化箓*10",
"后天造化箓*10",
"后天造化箓*10",
"后天造化箓*10",
"后天造化箓*10",
"后天造化箓*10",
"激活凡品气运图鉴",
"激活圣品气运图鉴",
}
TianMingOBJ.TianMingList = {
[1] = ssrRequireCsvCfg("cfg_TianMing_Fan"), --天命凡
[2] = ssrRequireCsvCfg("cfg_TianMing_Ling"), --天命灵
[3] = ssrRequireCsvCfg("cfg_TianMing_Xian"), --天命仙
[4] = ssrRequireCsvCfg("cfg_TianMing_Sheng"), --天命圣
[5] = ssrRequireCsvCfg("cfg_TianMing_Di"), --天命帝
}
--枚举颜色
TianMingOBJ.levelColor = {
[1] = "#f0ecdd",
[2] = "#d5e5ff",
[3] = "#fdcbfe",
[4] = "#ffddb8",
[5] = "#ffdbd0",
}
--枚举品质名称
TianMingOBJ.qualityName = {
[1] = "凡品",
[2] = "灵品",
[3] = "仙品",
[4] = "圣品",
[5] = "帝品",
}
--后天开启
TianMingOBJ.enumeOpenHouTian = {
[1] = { { "后天造化箓", 10 } },
[2] = { { "后天造化箓", 10 } },
[3] = { { "后天造化箓", 10 } },
[4] = { { "后天造化箓", 10 } },
[5] = { { "后天造化箓", 10 } },
[6] = { { "后天造化箓", 10 } },
[7] = { { "后天造化箓", 10 } },
[8] = { { "后天造化箓", 10 } },
[9] = { { "后天造化箓", 10 } },
[10] = { { "后天造化箓", 10 } },
}
--图鉴配置
TianMingOBJ.TianMingTuJianConfig = {
[1] = { var = "VarCfg.T_TianMing_Fan", max = 18, attr = { [1] = 10000, [4] = 5000 }, baoLvAddtion = { [218] = 5 } },
[2] = { var = "VarCfg.T_TianMing_Ling", max = 20, attr = { [75] = 1500, [200] = 30000 }, baoLvAddtion = { [218] = 10 } },
[3] = { var = "VarCfg.T_TianMing_Xian", max = 24, attr = { [21] = 15, [22] = 15 }, baoLvAddtion = { [218] = 20 } },
[4] = { var = "VarCfg.T_TianMing_Sheng", max = 28, attr = { [79] = 1500, [80] = 15 }, baoLvAddtion = { [218] = 30 } },
[5] = { var = "VarCfg.T_TianMing_Di", max = 34, attr = { [208] = 15, [209] = 15, [210] = 15, [211] = 15, [212] = 15, [213] = 15, [214] = 15, [221] = 15, [222] = 15, [223] = 15, [224] = 15, [225] = 15, [202] = 1 }, baoLvAddtion = { [218] = 30 } },
}
--图鉴默认选择ID
TianMingOBJ.TuJianSelectId = 1
TianMingOBJ.SkipAnimation = false
--记录引导状态
TianMingOBJ.guideStateID = 0
function TianMingOBJ:main(objcfg)
self.cfgList = {}
self.currSelectPos = 0
self.currQuality = 0
self.currSelectedBtnObj = nil
self.objcfg = objcfg
self.pageType = 1
self.closeLock = false
ssrMessage:sendmsg(ssrNetMsgCfg.TianMing_openUI)
end
function TianMingOBJ:openUI(arg1, arg2, arg3, data)
self.unLockData = data["unLock"]
self.myTianMingData = data["myTianMing"]
self:ShowUI(self.objcfg)
end
-------------------------------↓↓↓ UI操作 ↓↓↓---------------------------------------
-- 显示天命UI界面
function TianMingOBJ:ShowUI(objcfg)
-- 初始化按钮锁定状态,防止重复点击
self.lockBtn = false
-- 创建UI窗口,设置窗口大小、是否模态、是否可拖动等属性,并关联NPCID
local parent = GUI:Win_Create(self.__cname, 0, 0, ssrConstCfg.width, ssrConstCfg.height, false, false, true, true, true, objcfg.NPCID)
-- 加载UI导出文件(通常是编辑器生成的布局文件)
GUI:LoadExport(parent, objcfg.UI_PATH)
-- 存储父节点引用
self._parent = parent
-- 获取UI元素的代理对象,方便通过名称访问UI控件
self.ui = GUI:ui_delegate(parent)
--ssrSetWidgetPosition(parent, self.ui.ImageBG, 2,0) -- 注释掉的设置背景位置的代码
-- 启用背景图片的触摸事件,使其可以接收点击等事件
GUI:setTouchEnabled(self.ui.ImageBG, true)
-- 设置背景图片位置为左上角 (0, 0)
GUI:setPosition(self.ui.ImageBG, 0, 0)
-- 设置背景图片内容尺寸与屏幕宽高一致
GUI:setContentSize(self.ui.ImageBG, ssrConstCfg.width, ssrConstCfg.height)
-- 关闭按钮
-- 为关闭按钮添加点击事件监听器
GUI:addOnClickEvent(self.ui.CloseButton, function()
-- 点击时调用CloseUI方法关闭界面
self:CloseUI()
end)
-- 设置关闭按钮的Z轴层级,使其显示在其他元素之上
GUI:setLocalZOrder(self.ui.CloseButton, 20)
-- 设置跳过动画复选框的Z轴层级
GUI:setLocalZOrder(self.ui.CheckBox, 30)
-- 打开窗口缩放动画 (当前注释掉)
--GUI:Timeline_Window1(self._parent)
--self:ExtractShow() -- 注释掉的显示提取方法
-- 为图鉴按钮添加点击事件监听器
GUI:addOnClickEvent(self.ui.ButtonTuJian, function()
-- 点击时发送查看图鉴的网络消息
ssrMessage:sendmsg(ssrNetMsgCfg.TianMing_TJResponse)
end)
-- 为开始按钮添加点击事件监听器
GUI:addOnClickEvent(self.ui.ButtonStart, function()
-- 如果按钮被锁定,则直接返回,防止重复点击
if self.lockBtn then
return
end
-- 检查是否选择了气运位置
if self.currSelectPos == 0 then
-- 如果未选择,发送提示消息给玩家
sendmsg9("请点击选择气运的位置!")
return
end
-- 锁定按钮,防止连续点击
self.lockBtn = true
-- 使用调度器延迟0.5秒后解锁按钮
SL:scheduleOnce(self.ui.ButtonStart, function()
self.lockBtn = false
end, 0.5)
-- 检查当前气运品质是否大于等于4(通常表示较高品质)
if self.currQuality >= 4 then
-- 获取当前品质的名称
local currQualityName = self.qualityName[self.currQuality]
-- 准备一个数据表用于通用提示弹窗
local data = {}
-- 设置弹窗提示文本,告知玩家继续操作会覆盖当前高品质气运
data.str = "当前品质为【" .. currQualityName .. "】,继续操作将会覆盖当前品质,是否继续?"
-- 设置弹窗按钮类型(例如:确定/取消)
data.btnType = 2
-- 设置弹窗回调函数
data.callback = function(atype, param)
-- 如果点击了确定按钮 (atype == 1)
if atype == 1 then
-- 发送网络请求1(通常是开始抽取气运的请求)
self:RequestNet1()
--self.lockBtn = true -- 注释掉的锁定按钮代码
end
end
-- 打开通用提示弹窗
SL:OpenCommonTipsPop(data)
else
-- 如果当前品质小于4,直接发送网络请求1
self:RequestNet1()
--self.lockBtn = true -- 注释掉的锁定按钮代码
end
end)
-- 跳过动画复选框
-- 根据self.SkipAnimation状态设置复选框的选中状态
GUI:CheckBox_setSelected(self.ui.CheckBox, self.SkipAnimation)
-- 为跳过动画复选框添加点击事件监听器
GUI:addOnClickEvent(self.ui.CheckBox,function ()
-- 获取复选框当前的选中状态
local isSelected = GUI:CheckBox_isSelected(self.ui.CheckBox)
-- 更新self.SkipAnimation状态,与复选框选中状态相反(点击即切换)
self.SkipAnimation = not isSelected
end)
-- 调用Show方法显示UI界面
self:Show()
-- 初始化按钮偏移量
self.btnOffset = 0
-- 如果屏幕宽度大于1024,计算按钮偏移量(用于适配不同分辨率)
if ssrConstCfg.width > 1024 then
self.btnOffset = (ssrConstCfg.width - 1024) / 2
end
-- 获取左侧滚动视图的世界坐标
self.worldPosLeft = GUI:getWorldPosition(self.ui.ScrollViewLeft)
-- 计算左侧滚动视图的中心位置(基于世界坐标和半径)
self.centerPosLeft = cc.p(self.worldPosLeft.x + self.radiusLeft, self.worldPosLeft.y)
-- 获取左侧滚动视图的所有子节点(通常是滚动项)
self.childListLeft = GUI:getChildren(self.ui.ScrollViewLeft)
-- 更新左侧滚动项的位置(根据滚动位置调整显示)
self:updateItemPos(self.childListLeft, self.worldPosLeft, self.radiusLeft, 460 - self.btnOffset)
-- 为左侧滚动视图添加滚动事件监听器
GUI:ScrollView_addOnScrollEvent(self.ui.ScrollViewLeft, function(sender, type, type1)
-- 滚动时更新左侧滚动项的位置
self:updateItemPos(self.childListLeft, self.worldPosLeft, self.radiusLeft, 460 - self.btnOffset)
end)
-- 获取右侧滚动视图的世界坐标
self.worldPosRight = GUI:getWorldPosition(self.ui.ScrollViewRight)
-- 计算右侧滚动视图的中心位置
self.centerPosRight = cc.p(self.worldPosRight.x + self.radiusRight, self.worldPosRight.y)
-- 获取右侧滚动视图的所有子节点
self.childListRight = GUI:getChildren(self.ui.ScrollViewRight)
-- 更新右侧滚动项的位置
self:updateItemPos(self.childListRight, self.worldPosRight, self.radiusRight, -1084 - self.btnOffset)
-- 为右侧滚动视图添加滚动事件监听器
GUI:ScrollView_addOnScrollEvent(self.ui.ScrollViewRight, function(sender, type, type1)
-- 滚动时更新右侧滚动项的位置
self:updateItemPos(self.childListRight, self.worldPosRight, self.radiusRight, -1084 - self.btnOffset)
end)
-- 初始化是否使用鸿运当头的标志
self.useHYDT = 0
-- 调用InitButton方法初始化按钮状态或内容
self:InitButton()
-- 调用StartGuide方法启动新手引导或相关指引
self:StartGuide()
end
function TianMingOBJ:UpdateUI(data)
self.unLockData = data["unLock"]
self.myTianMingData = data["myTianMing"]
self:InitButton()
end
function TianMingOBJ:StartGuide()
local guideId = ZhuXianRenWuOBJ:getGuideTask()
ZhuXianRenWuOBJ:setGuideTask(0)
if guideId == 3 then
for _, btn in ipairs(self.childListLeft) do
local params = GUI:Win_GetParam(btn)
if params.state == 1 or params.state == 0 then
self.guideStateID = 1
local data = {}
data.dir = 5 -- 方向(1~8)从左按瞬时针
data.guideWidget = btn -- 当前节点
data.guideParent = self.ui.ImageBG -- 父窗口
data.guideDesc = "点击" -- 文本描述
data.isForce = false -- 强制引导
SL:StartGuide(data)
break
end
end
elseif guideId == 5 then
for _, btn in ipairs(self.childListRight) do
local params = GUI:Win_GetParam(btn)
if params.state == 1 or params.state == 0 then
self.guideStateID = 1
local data = {}
data.dir = 5 -- 方向(1~8)从左按瞬时针
data.guideWidget = btn -- 当前节点
data.guideParent = self.ui.ImageBG -- 父窗口
data.guideDesc = "点击" -- 文本描述
data.isForce = false -- 强制引导
SL:StartGuide(data)
break
end
end
end
--修仙引导
--if guideId == 1 then
-- local data = {}
-- data.dir = 5 -- 方向(1~8)从左按瞬时针
-- data.guideWidget = PlayerFrame._ui.Button_xiuXian -- 当前节点
-- data.guideParent = PlayerFrame._parent -- 父窗口
-- data.guideDesc = "点击" -- 文本描述
-- data.isForce = false -- 强制引导
-- SL:StartGuide(data)
--elseif guideId == 2 then
--local data = {}
-- data.dir = 5 -- 方向(1~8)从左按瞬时针
-- data.guideWidget = PlayerFrame._ui.Button_qiYun -- 当前节点
-- data.guideParent = PlayerFrame._parent -- 父窗口
-- data.guideDesc = "点击" -- 文本描述
-- data.isForce = false -- 强制引导
-- SL:StartGuide(data)
--end
end
--使用鸿运当头洗练
function TianMingOBJ:RequestNet2()
local params = GUI:Win_GetParam(self.currSelectedBtnObj)
--如果当前按钮没有洗练 直接请求
if params.state == 1 then
ssrMessage:sendmsg(ssrNetMsgCfg.TianMing_Request, self.currSelectPos, 1, self.useHYDT)
sendmsg9("首次洗练气运免费#249")
return
end
local costItemName = ""
local cost = {}
if self.currSelectPos > 12 then
costItemName = "转运金丹"
else
costItemName = "气运精魄"
end
cost = { { costItemName, 1 } }
local name, name = Player:checkItemNumByTable(cost)
if name then
local data = {}
data.str = "你背包没有【" .. costItemName .. "】是否消耗【200灵符】继续?"
data.btnType = 2
data.callback = function(atype, param)
if atype == 1 then
ssrMessage:sendmsg(ssrNetMsgCfg.TianMing_Request, self.currSelectPos, 2 ,self.useHYDT)
end
end
SL:OpenCommonTipsPop(data)
else
ssrMessage:sendmsg(ssrNetMsgCfg.TianMing_Request, self.currSelectPos, 1, self.useHYDT)
end
end
--请求洗练--检测是否有鸿运当头
function TianMingOBJ:RequestNet1()
local cost = { { "鸿运当头", 1 } }
local name, name = Player:checkItemNumByTable(cost)
if not name then
local data = {}
data.str = "检测到您背包里有物品 :鸿运当头 使用鸿运当头洗炼气运必出帝品气运。 是否使用?"
data.btnType = 2
data.callback = function(atype, param)
if atype == 1 then
self.useHYDT = 1
self:RequestNet2()
else
self.useHYDT = 0
self:RequestNet2()
end
end
SL:OpenCommonTipsPop(data)
else
self.useHYDT = 0
self:RequestNet2()
end
end
--关闭窗口
function TianMingOBJ:CloseUI()
if self.closeLock then
return
end
if self.pageType == 1 then
GUI:Win_Close(self._parent)
elseif self.pageType == 2 then
self:BackAnimation(1)
self.pageType = 1
elseif self.pageType == 3 then
self:BackAnimation(2)
self.pageType = 1
end
end
--响应天命图鉴数据
function TianMingOBJ:TJResponse(arg1, arg2, arg3, data)
self.tuJianData = data
self.closeLock = true
self.pageType = 3
self:SpreadAnimation(2)
end
--响应抽取结果
function TianMingOBJ:CQResponse(pos, quality, index)
self.currQuality = quality
self.currIndex = index
--跳过动画
if self.SkipAnimation then
self:modifyButtonStyle(pos, quality, index)
else
self.closeLock = true
self.pageType = 2
self:SpreadAnimation(1)
SL:scheduleOnce(self.ui.ImageBG, function()
self:modifyButtonStyle(pos, quality, index)
end, 0.5)
end
end
--修改天命展示按钮和说明
function TianMingOBJ:modifyButtonStyle(pos, quality, index)
local cfg = self.TianMingList[quality][index]
local pathImg = ""
if pos > 12 then
pathImg = "res/custom/TianMing/static/right_" .. quality .. ".png"
else
pathImg = "res/custom/TianMing/static/left_" .. quality .. ".png"
end
GUI:Button_loadTextureNormal(self.currSelectedBtnObj, pathImg)
GUI:Button_setTitleText(self.currSelectedBtnObj, cfg.name)
GUI:Button_setTitleColor(self.currSelectedBtnObj, self.levelColor[quality])
delRedPoint(self.currSelectedBtnObj)
GUI:Win_SetParam(self.currSelectedBtnObj,{id = pos , state = 2}) --设置为已洗练状态
local attDesc = cfg.attDesc or ""
local fontDesc = cfg.fontDesc or ""
local Text_desc = attDesc .. "\n" .. fontDesc
--SL:dump(Text_desc)
GUI:Text_setString(self.ui.Text_desc, Text_desc)
self.cfgList[pos] = {
attDesc = attDesc,
fontDesc = fontDesc
}
end
--初始化按钮
-- 天命系统按钮初始化函数,负责设置左右两侧天命位置的按钮状态和事件
function TianMingOBJ:InitButton()
-- 遍历左侧天命位置按钮列表
for i, child in ipairs(self.childListLeft) do
local isActivate = self.unLockData[i] --是否激活(解锁状态)
local isHas = #self.myTianMingData[i] > 1 --是否拥有天命(数据长度大于1表示已获得)
local tianMingLevel, tianMingType = 0, 0 --天命等级,天命类型
local tianMingName = "" --天命名字
local color = "" --天命名称显示颜色
local cfg -- 天命配置数据
-- [42] = {
-- name = "吸蓝大法",
-- attDesc = "攻击几率将人物魔法值吸光并恢复自身50%生命",
-- },
-- 如果玩家已拥有该位置的天命,获取其详细信息
if isHas then
tianMingLevel = self.myTianMingData[i][1] -- 获取天命等级
tianMingType = self.myTianMingData[i][2] -- 获取天命类型
cfg = self.TianMingList[tianMingLevel][tianMingType] -- 根据等级和类型获取配置
if cfg then
self.cfgList[i] = cfg -- 缓存配置数据
tianMingName = cfg.name -- 获取天命名称
color = self.levelColor[tianMingLevel] -- 根据等级获取对应颜色
end
end
--给天命位置状态 0=未解锁 1=已解锁未洗练 2=已经洗练
local tianMingState = 0
-- 根据激活状态和拥有状态设置按钮外观
if isActivate == 0 then
-- 未解锁状态:显示解锁条件文本,使用灰色背景
GUI:Button_setTitleText(child, self.LeftUnLock[i])
GUI:Button_loadTextureNormal(child, "res/custom/TianMing/static/grey_left.png")
tianMingState = 0
elseif isActivate == 1 and not isHas then
-- 已解锁但未获得天命:清空文本,使用可用状态背景,添加红点提示
GUI:Button_setTitleText(child, "")
GUI:Button_loadTextureNormal(child, "res/custom/TianMing/static/unlockLeft.png")
tianMingState = 1
addRedPoint(child, 100, 28) -- 在按钮上添加红点提示(坐标100,28)
elseif isHas then
-- 已获得天命:显示天命名称,使用对应等级的背景,设置名称颜色
GUI:Button_setTitleText(child, tianMingName)
GUI:Button_loadTextureNormal(child, "res/custom/TianMing/static/left_" .. tianMingLevel .. ".png")
GUI:Button_setTitleColor(child, color)
tianMingState = 2
end
-- 设置按钮参数,包含ID和状态信息
GUI:Win_SetParam(child, { id = i, state = tianMingState })
-- 为按钮添加点击事件监听器
GUI:addOnClickEvent(child, function()
-- 新手引导相关逻辑
if self.guideStateID == 1 then
self.guideStateID = 0 -- 重置引导状态
local data = {}
data.dir = 5 -- 引导箭头方向(1~8)从左按顺时针
data.guideWidget = self.ui.ButtonStart -- 引导目标控件(开始按钮)
data.guideParent = self.ui.ImageBG -- 引导父窗口
data.guideDesc = "点击" -- 引导文本描述
data.isForce = false -- 是否强制引导
SL:StartGuide(data) -- 启动引导
end
-- 检查是否未解锁,如果未解锁则提示解锁条件
if isActivate == 0 then
sendmsg9(self.LeftUnLock[i] .. "解锁")
return
end
-- 获取按钮标签并设置当前选择的位置和品质
local tag = GUI:getTag(child)
self.currSelectPos = tag -- 当前选择的天命位置
self.currQuality = tianMingLevel -- 当前选择的天命品质等级
self:SetButtonSelected(tag) -- 设置按钮为选中状态
-- 更新描述文本显示
local cfgDesc = self.cfgList[tag]
if cfgDesc then
local attDesc = cfgDesc.attDesc or "" -- 属性描述
local fontDesc = cfgDesc.fontDesc or "" -- 字体描述
local Text_desc = attDesc .. "\n" .. fontDesc -- 组合描述文本
GUI:Text_setString(self.ui.Text_desc, Text_desc) -- 设置描述文本
else
GUI:Text_setString(self.ui.Text_desc, "") -- 清空描述文本
end
end)
end
-- 遍历右侧天命位置按钮列表(后天气运)
for i, child in ipairs(self.childListRight) do
local j = 12 + i -- 右侧按钮的实际索引(从13开始)
local isActivate = self.unLockData[j] --是否激活
local isHas = #self.myTianMingData[j] > 1 --是否拥有
local tianMingLevel, tianMingType = 0, 0 --天命等级,天命类型
local tianMingName = "" --天命名字
local color = "" --颜色
local cfg -- 配置数据
-- 如果已拥有该位置的天命,获取详细信息
if isHas then
tianMingLevel = self.myTianMingData[j][1]
tianMingType = self.myTianMingData[j][2]
cfg = self.TianMingList[tianMingLevel][tianMingType]
if cfg then
self.cfgList[j] = cfg
tianMingName = cfg.name
color = self.levelColor[tianMingLevel]
end
end
--给天命位置状态 0=未解锁 1=已解锁未洗练 2=已经洗练
local tianMingState = 0
-- 根据状态设置右侧按钮外观
if isActivate == 0 then
-- 未解锁状态
tianMingState = 0
GUI:Button_setTitleText(child, self.RightUnLock[i])
GUI:Button_loadTextureNormal(child, "res/custom/TianMing/static/grey_right.png")
elseif isActivate == 1 and not isHas then
-- 已解锁但未获得天命状态
tianMingState = 1
GUI:Button_setTitleText(child, "")
GUI:Button_loadTextureNormal(child, "res/custom/TianMing/static/unlockRight.png")
addRedPoint(child, 200, 28) -- 添加红点提示(坐标200,28)
elseif isHas then
-- 已获得天命状态
tianMingState = 2
GUI:Button_setTitleText(child, tianMingName)
GUI:Button_loadTextureNormal(child, "res/custom/TianMing/static/right_" .. tianMingLevel .. ".png")
GUI:Button_setTitleColor(child, color)
end
-- 设置按钮参数
GUI:Win_SetParam(child, { id = i, state = tianMingState })
--没解锁的检查物品条件,显示材料需求红点
if isActivate == 0 then
local cost = self.enumeOpenHouTian[i] -- 获取解锁所需材料
if cost then
-- 检查玩家是否有足够材料,有则显示红点提示可解锁
Player:checkAddRedPoint(child, cost, 30, 5)
end
end
-- 为右侧按钮添加点击事件
GUI:addOnClickEvent(child, function()
if isActivate == 0 then
-- 未解锁状态的处理
if i >= 1 and i <= 10 then
-- 发送解锁后天气运的网络请求
ssrMessage:sendmsg(ssrNetMsgCfg.TianMing_OpenHouTian,i)
else
-- 显示解锁提示信息
sendmsg9(self.RightUnLock[i] .. "解锁")
end
return
end
-- 设置选中状态和更新描述
local tag = GUI:getTag(child)
self.currSelectPos = tag
self.currQuality = tianMingLevel
self:SetButtonSelected(tag, 2) -- 参数2表示右侧按钮
-- 更新描述文本
local cfgDesc = self.cfgList[tag]
if cfgDesc then
local attDesc = cfgDesc.attDesc or ""
local fontDesc = cfgDesc.fontDesc or ""
local Text_desc = attDesc .. "\n" .. fontDesc
GUI:Text_setString(self.ui.Text_desc, Text_desc)
else
GUI:Text_setString(self.ui.Text_desc, "")
end
end)
end
end
--激活后天气运后返回
-- 处理后天气运解锁成功后的UI更新
function TianMingOBJ:OpenHouTian(index)
local qiYunWhere = 12 + index -- 计算气运位置索引
self.unLockData[qiYunWhere] = 1 --标记为激活状态
-- 更新按钮外观为已解锁状态
GUI:Button_setTitleText(self.childListRight[index], "") -- 清空标题文本
GUI:Button_loadTextureNormal(self.childListRight[index], "res/custom/TianMing/static/unlockRight.png")
-- 更新红点状态
delRedPoint(self.childListRight[index]) -- 删除旧红点
addRedPoint(self.childListRight[index], 200, 28) -- 添加新红点(表示可洗练)
-- 设置按钮参数(注意:这里pos变量可能有问题,应该是index)
GUI:Win_SetParam(self.childListRight[index],{id = pos , state = 1}) --激活后设置为未洗练状态
-- 重新绑定点击事件
GUI:addOnClickEvent(self.childListRight[index],function(widget)
local tag = GUI:getTag(widget)
self.currSelectPos = tag
self:SetButtonSelected(tag,2) -- 设置为选中状态
end)
-- 更新其他未解锁按钮的红点状态
for i, child in ipairs(self.childListRight) do
local qiYunWhere = 12 + i
local isActivate = self.unLockData[qiYunWhere]
if isActivate == 0 then
local cost = self.enumeOpenHouTian[i]
if cost then
delRedPoint(child) -- 先删除旧红点
Player:checkAddRedPoint(child, cost, 30, 5) -- 重新检查材料条件
end
end
end
end
--设置按钮选中状态
-- 管理所有按钮的选中状态,确保只有一个按钮处于选中状态
function TianMingOBJ:SetButtonSelected(tag, where)
-- 复制右侧按钮列表
local childList = SL:CopyData(self.childListRight)
-- 将左侧按钮添加到列表中,形成完整的按钮列表
for i, v in ipairs(self.childListLeft) do
table.insert(childList, v)
end
-- 遍历所有按钮,清除选中效果并设置新的选中按钮
for i, child in ipairs(childList) do
-- 移除现有的选中效果
local img = GUI:getChildByName(child, "sfx_selected")
if img then
GUI:removeChildByName(child, "sfx_selected")
end
-- 检查是否为目标按钮
local thisTag = GUI:getTag(child)
if thisTag == tag then
self.currSelectedBtnObj = child -- 记录当前选中的按钮对象
self:SetButtonSelectedImg(child, where) -- 设置选中效果
end
end
end
--设置选中图片
-- 为选中的按钮添加视觉效果(特效动画)
function TianMingOBJ:SetButtonSelectedImg(widget, where)
local sfx_selected
if where == 2 then
-- 右侧按钮的选中效果
--Image_selected = GUI:Image_Create(widget, "Image_selected", -2.00, -1.00, "res/custom/TianMing/static/selected_right.png")
local sfx_selected = GUI:Effect_Create(widget, "sfx_selected", 128, 56, 0, 17151, 0, 0, 3, 1)
else
-- 左侧按钮的选中效果
--Image_selected = GUI:Image_Create(widget, "Image_selected", -2.00, -1.00, "res/custom/TianMing/static/selected_left.png")
local sfx_selected = GUI:Effect_Create(widget, "sfx_selected", 100, 56, 0, 17150, 0, 0, 3, 1)
end
--GUI:setTouchEnabled(sfx_selected, false) -- 禁用特效的触摸事件(注释掉)
end
-- 更新滚动视图中按钮的位置
-- 实现弧形排列效果,根据滚动位置动态调整按钮的X坐标
function TianMingOBJ:updateItemPos(childList, worldPos, radius, shifting)
for _, child in ipairs(childList) do
GUI:setAnchorPoint(child, 0.5, 0.5) -- 设置锚点为中心
local oldPos = GUI:getWorldPosition(child) -- 获取按钮当前世界坐标
local oldPosY = GUI:getPositionY(child) -- 获取按钮Y坐标
local yDiff = worldPos.y - oldPos.y + 4 -- 计算Y轴差值
local juli = math.sqrt(math.abs((radius ^ 2) - (yDiff ^ 2))) --计算距离(勾股定理)
local newX = worldPos.x - mathSign(radius) * juli -- 计算新的X坐标
GUI:setPosition(child, newX + shifting, oldPosY) -- 设置新位置(加上偏移量)
end
end
--按钮扩散动画
-- 播放界面切换时的动画效果,将按钮移出屏幕
function TianMingOBJ:SpreadAnimation(Ttype)
if Ttype == 2 then
-- 类型2:图鉴模式,淡出主要装饰并显示图鉴
GUI:Timeline_FadeOut(self.FramesDz, 0.25) -- 淡出装饰特效
self:TuJianShow() -- 显示图鉴内容
end
-- 执行按钮扩散动画
GUI:Timeline_MoveTo(self.ui.NodeLeft, { x = -800, y = 0 }, 0.5) -- 左侧按钮向左移出
GUI:Timeline_MoveTo(self.ui.NodeRigth, { x = 800, y = 0 }, 0.5, function() -- 右侧按钮向右移出
self.closeLock = false -- 解除关闭锁定
if Ttype == 1 then
self:ExtractShow() -- 类型1:显示抽取界面
end
end)
GUI:Timeline_MoveTo(self.ui.Nodebottom, { x = 0, y = -500 }, 0.4) -- 底部元素向下移出
GUI:Timeline_MoveTo(self.ui.CheckBox, { x = -88, y = -500 }, 0.4) -- 复选框向下移出
end
--回来的动画
-- 播放返回主界面时的动画效果,将按钮移回原位
function TianMingOBJ:BackAnimation(Ttype)
-- 执行返回动画,将所有元素移回原始位置
GUI:Timeline_MoveTo(self.ui.NodeLeft, { x = 0, y = 0 }, 0.3) -- 左侧按钮归位
GUI:Timeline_MoveTo(self.ui.NodeRigth, { x = 0, y = 0 }, 0.3) -- 右侧按钮归位
GUI:Timeline_MoveTo(self.ui.Nodebottom, { x = 0, y = 0 }, 0.3) -- 底部元素归位
GUI:Timeline_MoveTo(self.ui.CheckBox, { x = -88, y = -137 }, 0.3) -- 复选框归位
-- 根据类型清理相应的子节点
if Ttype == 1 then
-- 类型1:清理抽取相关节点
GUI:removeAllChildren(self.ui.NodeNext)
GUI:removeAllChildren(self.ui.NodeFont)
elseif Ttype == 2 then
-- 类型2:清理图鉴相关节点,恢复装饰透明度
GUI:removeAllChildren(self.ui.NodeTuJian)
GUI:setOpacity(self.FramesDz, 255) -- 恢复装饰特效的完全不透明
end
end
--显示初始界面
-- 创建和设置主界面的背景动画和装饰效果
function TianMingOBJ:Show()
-- 创建背景动画帧序列(循环播放的背景动画)
local FramesBg = GUI:Frames_Create(self.ui.ImageBG, "Frames_bg", 0, 0, "res/custom/TianMing/bg1/bg_", ".jpg", 1, 41, { count = 41, speed = 100, loop = -1, finishhide = 0 })
GUI:setContentSize(FramesBg, ssrConstCfg.width, ssrConstCfg.height) -- 设置背景尺寸与屏幕一致
GUI:setLocalZOrder(FramesBg, 1) -- 设置背景层级为1(最底层)
-- 设置主节点位置为屏幕中心
GUI:setPosition(self.ui.NodeMain, ssrConstCfg.width / 2, ssrConstCfg.height / 2)
GUI:setLocalZOrder(self.ui.NodeMain, 10) -- 设置主节点层级为10
-- 设置关闭按钮位置(右上角)
GUI:setPosition(self.ui.CloseButton, ssrConstCfg.width - 100, ssrConstCfg.height - 100)
-- 重复设置主节点位置(可能是为了确保位置正确)
GUI:setPosition(self.ui.NodeMain, ssrConstCfg.width / 2, ssrConstCfg.height / 2)
-- 创建主装饰动画(中心的装饰特效)
local FramesDz = GUI:Frames_Create(self.ui.NodeMain, "Frames_main", 0, 50, "res/custom/TianMing/dz/dz_", ".png", 1, 15, { count = 15, speed = 100, loop = -1, finishhide = 0 })
GUI:setAnchorPoint(FramesDz, 0.5, 0.5) -- 设置装饰动画的锚点为中心
self.FramesDz = FramesDz -- 保存装饰动画引用,供其他方法使用
end
--显示图鉴界面
-- 天命图鉴界面显示函数,负责加载图鉴UI并初始化相关功能
function TianMingOBJ:TuJianShow()
local parent = self.ui.NodeTuJian -- 获取图鉴节点容器
GUI:LoadExport(parent, "A/TianMingTuJianUI") -- 加载图鉴UI布局文件
local ui = GUI:ui_delegate(parent) -- 获取UI代理对象,用于访问子控件
GUI:setLocalZOrder(self.ui.NodeTuJian, 2) -- 设置图鉴节点的层级为2(确保在前景显示)
GUI:setAnchorPoint(ui.Panel_1, 0.5, 0.5) -- 设置主面板锚点为中心
GUI:setPosition(ui.Panel_1, ssrConstCfg.width / 2, ssrConstCfg.height / 2) -- 将主面板居中显示
--GUI:setVisible(ui.Panel_1,false) -- 注释掉的隐藏面板代码
--设置默认选中状态和更新图鉴内容
self:TuJianUpdate(ui) -- 更新图鉴显示内容
local defaultSelectedBtn = ui["Button_" .. self.TuJianSelectId] -- 获取默认选中的按钮
self:SetTuJianButtonSelected(ui, defaultSelectedBtn) -- 设置默认按钮为选中状态
--为1-5号按钮绑定点击事件
for i = 1, 5 do
local btn = ui["Button_" .. i] -- 获取第i个按钮
GUI:addOnClickEvent(btn, function(btnObj)
self.TuJianSelectId = i -- 更新当前选中的图鉴类型ID
self:TuJianUpdate(ui) -- 刷新图鉴内容显示
self:SetTuJianButtonSelected(ui, btnObj) -- 设置新按钮为选中状态
end)
end
-- 设置面板淡入动画效果
GUI:setChildrenCascadeOpacityEnabled(ui.Panel_1, true) -- 启用子控件级联透明度
GUI:setOpacity(ui.Panel_1, 0) -- 初始透明度设为0(完全透明)
GUI:Timeline_FadeIn(ui.Panel_1, 0.5) -- 执行0.5秒的淡入动画
end
--设置图鉴按钮选中状态
-- 通过移动选中指示器图片来显示当前选中的按钮
function TianMingOBJ:SetTuJianButtonSelected(ui, btnObj)
if not btnObj then -- 安全检查:如果按钮对象不存在则直接返回
return
end
local btnPos = GUI:getPosition(btnObj) -- 获取按钮的当前位置坐标
-- 将选中指示器图片移动到按钮位置(带有-9像素的偏移调整)
GUI:setPosition(ui.Image_selected, btnPos.x - 9, btnPos.y - 9)
end
-- 辅助函数:计算表中键值对的数量
-- 用于统计已激活的图鉴数量
local function _findKeysNum(t)
local count = 0
for k, v in pairs(t) do -- 遍历表中的所有键值对
count = count + 1 -- 计数器递增
end
return count -- 返回总数量
end
-- 更新图鉴显示内容
-- 根据当前选中的图鉴类型,动态生成图鉴项目列表
function TianMingOBJ:TuJianUpdate(ui)
--self.tuJianData -- 图鉴数据(玩家已获得的图鉴信息)
--TianMingOBJ.TuJianSelectId = 1 -- 当前选中的图鉴类型ID
--local helpStr1 = {
-- self.data[1].."#250|/|10#70" -- 注释掉的富文本示例
--}
--createMultiLineRichText(self.ui.Node1, "Node1",0,0,helpStr1,nil,600,22) -- 注释掉的富文本创建
--GUI:ScrollView_removeAllChildren(ui.ScrollView_1) -- 注释掉的滚动视图清理方法
GUI:removeAllChildren(ui.ScrollView_1) -- 清空滚动视图中的所有子控件
-- 创建图鉴列表容器面板
local Panel_TJlist = GUI:Layout_Create(ui.ScrollView_1, "Panel_TJlist", 0.00, 0.00, 500, 200, false)
-- 获取当前选中类型的图鉴配置数据
local childList = self.TianMingList[self.TuJianSelectId] -- 当前类型的天命列表
local tuJianData = self.tuJianData[self.TuJianSelectId] -- 玩家已获得的图鉴数据
--计算布局参数
local totalCount = #childList -- 总图鉴数量
local inactiveCount = 0 -- 未激活数量(暂未使用)
local setInnerHeight = math.ceil(totalCount / 5) * 212 -- 计算滚动容器高度(每行5个,每个高212像素)
local tuJianConfig = self.TianMingTuJianConfig[self.TuJianSelectId] -- 获取图鉴配置信息
-- 遍历创建图鉴项目
for i, v in ipairs(childList or {}) do
-- 创建图鉴项目图片,路径格式:res/custom/TianMing/TuJian/{类型ID}/{项目ID}.png
local Image_item_ = GUI:Image_Create(Panel_TJlist, "Image_item_" .. i, 0, 0, string.format("res/custom/TianMing/TuJian/%s/%s.png", self.TuJianSelectId, i))
GUI:setAnchorPoint(Image_item_, 0.00, 0.00) -- 设置锚点为左下角
GUI:setTouchEnabled(Image_item_, false) -- 禁用触摸事件
GUI:setTag(Image_item_, i) -- 设置标签为索引值,用于排序
-- 判断图鉴项目状态
if i <= tuJianConfig.max then -- 如果在配置的最大数量范围内
if not tuJianData[tostring(i)] then -- 如果玩家尚未获得此图鉴
inactiveCount = inactiveCount + 1 -- 未激活计数器递增
GUI:Image_setGrey(Image_item_, true) -- 设置图片为灰色(未激活状态)
-- 添加"未开启"标识图片
GUI:Image_Create(Image_item_, "Image_gary_" .. i, 18.00, 2.00, "res/custom/TianMing/TuJian/weikaiqi.png")
end
else -- 如果超出配置范围
-- 添加特效(可能表示特殊或未开放的图鉴)
local effect = GUI:Effect_Create(Image_item_, "effect", 130, 200, 0, 63113, 0, 0, 0, 1)
end
end
--更新图鉴提示图片
-- 根据当前选中类型加载对应的提示图片
GUI:Image_loadTexture(ui.Image_tips, string.format("res/custom/TianMing/TuJian/tips_%s.png", self.TuJianSelectId))
-- 计算并显示激活数量统计
local activatedCount = _findKeysNum(tuJianData) -- 计算已激活的图鉴数量
local strTbl = {
--self.data[1].."#250|/|10#70" -- 注释掉的示例
-- 格式化显示:已激活数量/总数量,使用富文本颜色标记
string.format("%s#249|/#251|%s#250", activatedCount, tuJianConfig.max )
}
-- 创建富文本显示激活统计信息
createMultiLineRichText(ui.Panel_count, "Panel_count", 0, 0, strTbl, nil, 600, 24)
-- 设置滚动容器布局
GUI:setPositionY(Panel_TJlist, setInnerHeight - 212) -- 设置列表面板Y坐标(减去图片高度)
GUI:ScrollView_setInnerContainerSize(ui.ScrollView_1, 964, setInnerHeight) -- 设置滚动视图内容尺寸
--自动布局配置
GUI:UserUILayout(Panel_TJlist, {
dir = 3, -- 布局方向(3表示从左到右,从上到下)
addDir = 1, -- 添加方向
autosize = 1, -- 自动调整尺寸
gap = { x = 16, y = 0, l = 0 }, -- 间距设置:X轴间距16像素,Y轴间距0,左边距0
sortfunc = function(lists) -- 自定义排序函数
table.sort(lists, function(a, b)
return GUI:getTag(a) < GUI:getTag(b) -- 按标签(索引)升序排列
end)
end,
rownums = { 5 } -- 每行显示5个项目
})
-- 创建自定义滚动条
GUI:removeAllChildren(ui.Node_erticalBar) -- 清空滚动条节点
local scrollViewPos = GUI:getPosition(ui.ScrollView_1) -- 获取滚动视图位置
local scrollViewContentSize = GUI:getContentSize(ui.ScrollView_1) -- 获取滚动视图尺寸
local erticalBarOffsetWidth = scrollViewPos.x + scrollViewContentSize.width + 2 -- 计算滚动条X坐标偏移
-- 设置垂直滚动条
GUI:SetScrollViewVerticalBar(ui.Node_erticalBar, {
bgPic = "res/private/gui_edit/scroll/line.png", -- 滚动条背景图
barPic = "res/private/gui_edit/scroll/p.png", -- 滚动条滑块图片
Arr1PicN = "res/private/gui_edit/scroll/t.png", -- 向上箭头(正常状态)
Arr1PicP = "res/private/gui_edit/scroll/t_1.png", -- 向上箭头(按下状态)可选
Arr2PicN = "res/private/gui_edit/scroll/b.png", -- 向下箭头(正常状态)
Arr2PicP = "res/private/gui_edit/scroll/b_1.png", -- 向下箭头(按下状态)可选
default = 0, -- 滚动条默认位置(0表示顶部)
x = erticalBarOffsetWidth, -- 滚动条X坐标
y = GUI:getPosition(ui.ScrollView_1).y, -- 滚动条Y坐标(与滚动视图对齐)
list = ui.ScrollView_1, -- 关联的滚动容器
})
-- 重置滚动位置到顶部
GUI:ScrollView_scrollToPercentVertical(ui.ScrollView_1, 0, 0, true)
end
--显示抽取界面
-- 天命抽取界面显示函数,负责创建抽取动画效果和相关UI元素
function TianMingOBJ:ExtractShow()
GUI:setLocalZOrder(self.ui.NodeNext, 15) -- 设置抽取界面节点的层级为15(确保在最前景显示)
local parent = self.ui.NodeNext -- 获取抽取界面的父容器节点
---------------------------------------播放背景begin-----------------------------------
-- 创建背景动画序列帧(32帧循环播放)
local Frames = GUI:Frames_Create(parent, "Frames_1", 0, 0, "res/custom/TianMing/background/bg_", ".png", 1, 32, { count = 32, speed = 100, loop = -1, finishhide = 0 })
GUI:setContentSize(Frames, ssrConstCfg.width, ssrConstCfg.height) -- 设置背景尺寸为全屏
GUI:setOpacity(Frames, 0) -- 初始透明度设为0(完全透明)
GUI:runAction(Frames, GUI:ActionSequence(GUI:ActionFadeIn(2))) -- 执行2秒淡入动画
---------------------------------------播放竹筒begin-----------------------------------
-- 创建竹筒转开动画(21帧播放一次后隐藏)
Frames = GUI:Frames_Create(parent, "Frames_2", ssrConstCfg.width / 2, ssrConstCfg.height / 2 - 100, "res/custom/TianMing/zhuTong/zhuankai/zk_", ".png", 1, 21, { count = 21, speed = 100, loop = 1, finishhide = 1 })
GUI:setAnchorPoint(Frames, 0.5, 0.5) -- 设置锚点为中心
-- 延迟2.03秒后播放竹筒循环动画(仅在pageType为2时)
SL:scheduleOnce(self.ui.ImageBG, function()
if self.pageType == 2 then -- 检查页面类型是否为抽取页面
-- 创建竹筒循环动画(29帧无限循环)
Frames = GUI:Frames_Create(parent, "Frames_3", ssrConstCfg.width / 2, ssrConstCfg.height / 2 - 100, "res/custom/TianMing/zhuTong/loop/loop_", ".png", 1, 29, { count = 29, speed = 100, loop = -1, finishhide = 0 })
if Frames then
GUI:setAnchorPoint(Frames, 0.5, 0.5) -- 设置锚点为中心
end
end
end, 2.03)
---------------------------------------创建返回按钮-----------------------------------
-- 创建返回按钮,位于屏幕中下方
local backBtn = GUI:Button_Create(parent,"backBtn",ssrConstCfg.width / 2 - 90, ssrConstCfg.height / 2 - 300,"res/custom/TianMing/back_btn.png")
GUI:addOnClickEvent(backBtn,function ()
self:CloseUI() -- 绑定点击事件:关闭当前UI界面
end)
---------------------------------------播放竹筒end-----------------------------------
---------------------------------------播放魔云begin----------------------------------
-- 创建魔云动画效果(32帧播放一次后隐藏)
Frames = GUI:Frames_Create(parent, "Frames_4", 0, 0, "res/custom/TianMing/moYun/my_", ".png", 1, 32, { count = 32, speed = 100, loop = 1, finishhide = 1 })
GUI:setContentSize(Frames, ssrConstCfg.width, ssrConstCfg.height) -- 设置魔云尺寸为全屏
GUI:setOpacity(Frames, 0) -- 初始透明度设为0
GUI:runAction(Frames, GUI:ActionSequence(GUI:ActionFadeIn(2))) -- 执行2秒淡入动画
---------------------------------------播放end----------------------------------
---------------------------------------播放字begin----------------------------------
--self.currQuality = quality -- 当前品质(注释掉的变量说明)
--self.currIndex = index -- 当前索引(注释掉的变量说明)
-- 设置字体节点位置和层级
GUI:setPosition(self.ui.NodeFont, ssrConstCfg.width / 2, ssrConstCfg.height / 2 + 100) -- 位于屏幕中上方
GUI:setLocalZOrder(self.ui.NodeFont, 16) -- 设置字体层级为16(最高层级)
--字体淡入动画
-- 根据当前品质和索引创建字体淡入动画(12帧播放一次后隐藏)
Frames = GUI:Frames_Create(self.ui.NodeFont, "Frames_5", 0, 0, string.format("res/custom/TianMing/%s/%s/danru/danru_", self.currQuality, self.currIndex), ".png", 1, 13, { count = 12, speed = 100, loop = 1, finishhide = 1 })
GUI:setAnchorPoint(Frames, 0.5, 0.5) -- 设置锚点为中心
--字体循环动画
-- 延迟1.15秒后播放字体循环动画(仅在pageType为2时)
SL:scheduleOnce(self.ui.ImageBG, function()
if self.pageType == 2 then -- 检查页面类型是否为抽取页面
-- 创建字体循环动画(15帧无限循环)
Frames = GUI:Frames_Create(self.ui.NodeFont, "Frames_6", 0, 0, string.format("res/custom/TianMing/%s/%s/xunhuan/xunhuan_", self.currQuality, self.currIndex), ".png", 1, 15, { count = 15, speed = 100, loop = -1, finishhide = 0 })
GUI:setAnchorPoint(Frames, 0.5, 0.5) -- 设置锚点为中心
end
end, 1.15)
--竹筒(注释标记,可能用于代码组织)
end
---------------------------------------播放字end----------------------------------
-------------------------------↓↓↓ 网络消息 ↓↓↓---------------------------------------
function TianMingOBJ:SyncResponse(arg1, arg2, arg3, data)
if GUI:GetWindow(nil, self.__cname) then
--self:UpdateUI(data)
end
end
return TianMingOBJ