PGRData/Script/matrix/xui/xuifubenmainlinechapter/XUiGridChapter.lua

814 lines
30 KiB
Lua
Raw Permalink Normal View History

local XUiGridStage = require("XUi/XUiFubenMainLineChapter/XUiGridStage")
2024-09-01 20:49:41 +00:00
local XUiGridMainLineSkipStage = require("XUi/XUiFubenMainLineChapter/XUiGridMainLineSkipStage")
local XUiGridChapter = XClass(nil, "XUiGridChapter")
local MAX_STAGE_COUNT = CS.XGame.ClientConfig:GetInt("MainLineStageMaxCount")
function XUiGridChapter:Ctor(rootUi, ui, autoChangeBgArgs, isOnZhouMu)
self.RootUi = rootUi
self.GameObject = ui.gameObject
self.Transform = ui.transform
self.IsOnZhouMu = isOnZhouMu
self.RectTransform = self.Transform:GetComponent("RectTransform")
self.GridStageList = {}
self.GridEggStageList = {}
self.LineList = {}
XTool.InitUiObject(self)
self:InitAutoScript()
-- 周目模式,记录当前周目章节最后一关的初始通关状态
if self.IsOnZhouMu then
self.zhouMuChapterId = XDataCenter.FubenZhouMuManager.GetZhouMuChapterIdByZhouMuId(self.RootUi.ZhouMuId)
local lastStage = XFubenZhouMuConfigs.GetZhouMuChapterLastStage(self.zhouMuChapterId)
self.OriLastStageIsPass = XDataCenter.FubenManager.CheckStageIsPass(lastStage)
end
self:InitChangeBgPos(autoChangeBgArgs)
-- --配置的格子位移超过某个阀值时,更换背景图片
-- if not XTool.IsTableEmpty(autoChangeBgArgs) then
-- self.AutoChangeBgArgs = autoChangeBgArgs
-- local behaviour = self.GameObject:AddComponent(typeof(CS.XLuaBehaviour))
-- if self.Update then
-- behaviour.LuaUpdate = function() self:Update() end
-- end
-- end
-- ScrollRect的点击和拖拽会触发关闭详细面板
self:RegisterClickEvent(self.ScrollRect, handler(self, self.CancelSelect))
local dragProxy = self.ScrollRect.gameObject:AddComponent(typeof(CS.XUguiDragProxy))
dragProxy:RegisterHandler(handler(self, self.OnDragProxy))
self:OnEnable()
--读取自定义颜色数据
self.Colors = {
TxtChapterNameColor = self.TxtChapterNameColor ~= nil and self.TxtChapterNameColor.color,
TxtLeftTimeTipColor = self.TxtLeftTimeTipColor ~= nil and self.TxtLeftTimeTipColor.color,
TxtLeftTimeColor = self.TxtLeftTimeColor ~= nil and self.TxtLeftTimeColor.color,
StarColor = self.StarColor ~= nil and self.StarColor.color,
StarDisColor = self.StarDisColor ~= nil and self.StarDisColor.color,
ImageBottomColor = self.ImageBottomColor ~= nil and self.ImageBottomColor.color,
TxtStarNumColor = self.TxtStarNumColor ~= nil and self.TxtStarNumColor.color,
TxtDescrColor = self.TxtDescrColor ~= nil and self.TxtDescrColor.color,
Triangle0Color = self.Triangle0Color ~= nil and self.Triangle0Color.color,
Triangle1Color = self.Triangle1Color ~= nil and self.Triangle1Color.color,
Triangle2Color = self.Triangle2Color ~= nil and self.Triangle2Color.color,
Triangle3Color = self.Triangle3Color ~= nil and self.Triangle3Color.color
}
if self.PanelColors then
self.PanelColors.gameObject:SetActiveEx(false)
end
2024-09-01 20:49:41 +00:00
---@type XUiGridMainLineSkipStage
self.MainLineSkipStage = XUiGridMainLineSkipStage.New(self.PanelStageContent, self.RootUi)
end
function XUiGridChapter:GetColors()
return self.Colors
end
-- function XUiGridChapter:InitAutoChangeBgComponents()
-- if XTool.IsTableEmpty(self.AutoChangeBgArgs) then return end
-- local datumLinePrecent = self.AutoChangeBgArgs.DatumLinePrecent
-- if not datumLinePrecent or datumLinePrecent == 0 then return end
-- --阀值为滚动容器去掉自适应扩展的padding宽度之后的实际宽度/2
-- -- local padding = self.BoundSizeFitter.padding
-- -- local contentWidth = self.PanelStageContent.rect.width
-- -- local realWidth = contentWidth - padding.left - padding.right
-- --阀值修改为可视区中心
-- local viewPortRect = XUiHelper.TryGetComponent(self.Transform, "PaneStageList/ViewPort", "RectTransform")
-- if not viewPortRect then return end
-- local realWidth = viewPortRect.rect.width
-- -- self.LimitPosX = realWidth * datumLinePrecent
-- self.LimitPosX = realWidth * 0.5 --hyxtest
-- end
-- function XUiGridChapter:RefreshAutoChangeBgStageIndex()
-- if not self.LimitPosX then return end
-- --关卡格子相对于阀值点的位置
-- local stageIndex = self.AutoChangeBgArgs.StageIndex
-- if not stageIndex or stageIndex == 0 then return end
-- local stageTransform = self.PanelStageContent.transform:Find("Stage" .. stageIndex)
-- if XTool.UObjIsNil(stageTransform) then
-- XLog.Error("XUiGridChapter:RefreshAutoChangeBgStageIndex error:stage not exist,stageIndex is:" .. stageIndex)
-- return
-- end
-- local stageParent = stageTransform:GetComponent("RectTransform")
-- if XTool.UObjIsNil(stageParent) then
-- XLog.Error("XUiGridChapter:RefreshAutoChangeBgStageIndex error:stage parent not exist,stageIndex is:" .. stageIndex)
-- return
-- end
-- if not stageParent.gameObject.activeSelf then self.FirstSetBg = true return end
-- self.StagePosX = stageParent.anchoredPosition.x
-- --滚动容器移动距离
-- local delta = self.PanelStageContent.anchoredPosition.x
-- -- delta = self.StagePosX > self.LimitPosX and -delta or delta
-- --标记是否满足超过阀值的条件
-- self.AutoChangeBgFlag = self.StagePosX + delta > self.LimitPosX
-- self.FirstSetBg = self.AutoChangeBgFlag
-- end
function XUiGridChapter:InitChangeBgPos(autoChangeBgArgs)
if not autoChangeBgArgs then
return
end
--从配置获取需要切换bg的节点的indexList
local changeBgIndexList = autoChangeBgArgs.StageIndexList
if not changeBgIndexList or not next(changeBgIndexList) then
return
end
self.autoChangeBgCb = autoChangeBgArgs.AutoChangeBgCb
local behaviour = self.GameObject:AddComponent(typeof(CS.XLuaBehaviour))
if self.Update then
behaviour.LuaUpdate = function() self:Update() end
end
local viewPortRect = XUiHelper.TryGetComponent(self.Transform, "PaneStageList/ViewPort", "RectTransform")
if not viewPortRect then return end
local realWidth = viewPortRect.rect.width
self.ChangePosX = realWidth * (autoChangeBgArgs.DatumLinePrecent or 0.5)
self.ChangeBgPosList = {} --value: stageIndex, pos.x
for _, stageIndex in pairs(changeBgIndexList) do
-- local stage = self.GridStageList[stageIndex]
local stageTrans = self.PanelStageContent.transform:Find("Stage" .. stageIndex)
if not XTool.UObjIsNil(stageTrans) then
local stageParent = stageTrans:GetComponent("RectTransform")
local stagePosX = stageParent.anchoredPosition.x
table.insert(self.ChangeBgPosList, {stageIndex = stageIndex, stagePosX = stagePosX })
end
end
end
function XUiGridChapter:GetCurrentChangePosStageIndex()
local delta = self.PanelStageContent.anchoredPosition.x--滚动容器移动距离
local currPos = self.ChangePosX - delta
local firstStageInfo = self.ChangeBgPosList[1]
local lastStageInfo = self.ChangeBgPosList[#self.ChangeBgPosList]
local seletChangeBgIndex = nil
if currPos < firstStageInfo.stagePosX then
seletChangeBgIndex = 1
elseif currPos > lastStageInfo.stagePosX then
seletChangeBgIndex = #self.ChangeBgPosList + 1
else
for index = 1, #self.ChangeBgPosList - 1 do
if currPos > self.ChangeBgPosList[index].stagePosX and currPos < self.ChangeBgPosList[index + 1].stagePosX then
local tempSele = index + 1
if tempSele < math.abs(self.SeletChangeBgIndex or #self.ChangeBgPosList) then --考虑到进入时自动滑动
seletChangeBgIndex = - tempSele
else
seletChangeBgIndex = tempSele
end
break
end
end
end
if math.abs(seletChangeBgIndex or 0) == math.abs(self.SeletChangeBgIndex or 0) or not seletChangeBgIndex then
return self.SeletChangeBgIndex, false
end
self.SeletChangeBgIndex = seletChangeBgIndex
return seletChangeBgIndex, true
end
--配置的格子滑动位移超过某个阀值时触发一次回调
function XUiGridChapter:Update()
if not self.autoChangeBgCb then
return
end
local seleBgIndex, changeEnable = self:GetCurrentChangePosStageIndex()
if changeEnable then
if not self.firstSetChangeBg then
self.autoChangeBgCb(seleBgIndex, false)
self.firstSetChangeBg = true
else
self.autoChangeBgCb(seleBgIndex, true)
end
end
-- 之前的切换bg方法弃用 因为只兼容两个
-- if self.AutoChangeBgFlag == nil then return end
-- local cbParamFlag = self.AutoChangeBgFlag--回调参数
-- local delta = self.PanelStageContent.anchoredPosition.x--滚动容器移动距离
-- local fitCondition = self.StagePosX + delta > self.LimitPosX--滑动距离条件判断
-- --配置的格子在阀值左边还是右边
-- local moveDirectLeft = self.StagePosX > self.LimitPosX
-- if moveDirectLeft then
-- cbParamFlag = not cbParamFlag
-- --delta = -delta
-- fitCondition = not fitCondition
-- end
-- --滑动距离条件判断
-- if fitCondition then
-- if self.AutoChangeBgFlag then
-- --位移正向超过阀值回调
-- self.AutoChangeBgArgs.AutoChangeBgCb(cbParamFlag)
-- self.AutoChangeBgFlag = false
-- end
-- else
-- if not self.AutoChangeBgFlag then
-- --位移反向超过阀值回调
-- self.AutoChangeBgArgs.AutoChangeBgCb(cbParamFlag)
-- self.AutoChangeBgFlag = true
-- end
-- end
end
function XUiGridChapter:OnDragProxy(dragType)
if dragType == 0 then
self:OnScrollRectBeginDrag()
elseif dragType == 2 then
self:OnScrollRectEndDrag()
end
end
function XUiGridChapter:OnScrollRectBeginDrag()
if self:CancelSelect() then
self.ScrollRect.enabled = false
end
end
function XUiGridChapter:OnScrollRectEndDrag()
self.ScrollRect.enabled = true
end
-- auto
-- Automatic generation of code, forbid to edit
function XUiGridChapter:InitAutoScript()
self:AutoInitUi()
self:AutoAddListener()
end
function XUiGridChapter:AutoInitUi()
self.PanelStageContent = XUiHelper.TryGetComponent(self.Transform, "PaneStageList/ViewPort/PanelStageContent", "RectTransform")
self.BoundSizeFitter = XUiHelper.TryGetComponent(self.Transform, "PaneStageList/ViewPort/PanelStageContent", "XBoundSizeFitter")
self.SViewStageList = XUiHelper.TryGetComponent(self.Transform, "SViewStageList", "ScrollRect")
self.ScrollRect = XUiHelper.TryGetComponent(self.Transform, "PaneStageList", "ScrollRect")
-- 连线
for i = 1, MAX_STAGE_COUNT do
if not self.LineList[i] then
local line = self.PanelStageContent.transform:Find("Line" .. i)
self.LineList[i] = not XTool.UObjIsNil(line) and line
end
end
end
function XUiGridChapter:RegisterClickEvent(uiNode, func)
if func == nil then
XLog.Error("XUiGridChapter:RegisterClickEvent函数参数错误参数func不能为空")
return
end
if type(func) ~= "function" then
XLog.Error("XUiGridChapter:RegisterClickEvent函数错误, 参数func需要是function类型, func的类型是" .. type(func))
end
local listener = function(...)
func(self, ...)
end
CsXUiHelper.RegisterClickEvent(uiNode, listener)
end
function XUiGridChapter:AutoAddListener()
--self:RegisterClickEvent(self.SViewStageList, self.OnSViewStageListClick)
end
-- auto
function XUiGridChapter:ScrollRectRollBack()
-- 滚动容器回弹
local width = self.RectTransform.rect.width
local innerWidth = self.PanelStageContent.rect.width
innerWidth = innerWidth < width and width or innerWidth
local diff = innerWidth - width
local tarPosX
if self.PanelStageContent.localPosition.x < -width / 2 - diff then
tarPosX = -width / 2 - diff
elseif self.PanelStageContent.localPosition.x > -width / 2 then
tarPosX = -width / 2
else
-- self.ScrollRect.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Unrestricted
self.ScrollRect.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Elastic
return false
end
self:PlayScrollViewMoveBack(tarPosX)
return true
end
function XUiGridChapter:PlayScrollViewMoveBack(tarPosX)
local tarPos = self.PanelStageContent.localPosition
tarPos.x = tarPosX
XLuaUiManager.SetMask(true)
XUiHelper.DoMove(self.PanelStageContent, tarPos, XDataCenter.FubenMainLineManager.UiGridChapterMoveDuration, XUiHelper.EaseType.Sin, function()
-- self.ScrollRect.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Unrestricted
self.ScrollRect.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Elastic
XLuaUiManager.SetMask(false)
end)
end
function XUiGridChapter:GetGridByStageId(stageId)
if self.NormalStageList then
for k, v in pairs(self.NormalStageList) do
if v == stageId then
return self.GridStageList[k]
end
end
end
if self.EggStageList then
for k, v in pairs(self.EggStageList) do
if v == stageId then
return self.GridEggStageList[k]
end
end
end
return nil
end
function XUiGridChapter:GoToStage(stageId)
local grid = self:GetGridByStageId(stageId)
if not grid then
return
end
local gridTf = grid.Parent.gameObject:GetComponent("RectTransform")
--local posX = self.PanelStageContent.localPosition.x
2024-09-01 20:49:41 +00:00
local trueStage = XDataCenter.FubenMainLineManager.CheckTrueStageByStageId(stageId)
local value = trueStage and 12 or 2
local posX = gridTf.localPosition.x - self.RectTransform.rect.width / value
self.ScrollRect.horizontalNormalizedPosition = 0
-- local diff = (self.ScrollRect.content.rect.width - self.RectTransform.rect.width)
self.ScrollRect.horizontalNormalizedPosition = posX / (1 * self.ScrollRect.content.rect.width - self.RectTransform.rect.width)
2024-09-01 20:49:41 +00:00
self:PlayStageAnimation()
end
-- chapter 组件内容更新
function XUiGridChapter:UpdateChapterGrid(data)
self.Chapter = data.Chapter
self.HideStageCb = data.HideStageCb
self.ShowStageCb = data.ShowStageCb
self.EggStageList = {}
self.NormalStageList = {}
for _, v in pairs(data.StageList) do
local stageCfg = XDataCenter.FubenManager.GetStageCfg(v)
if self:IsEggStage(stageCfg) then
local eggNum = self:GetEggNum(data.StageList, stageCfg)
if eggNum ~= 0 then
local egg = { Id = v, Num = eggNum }
table.insert(self.EggStageList, egg)
end
else
table.insert(self.NormalStageList, v)
end
end
self:SetStageList()
2024-09-01 20:49:41 +00:00
self.MainLineSkipStage:SetSkipStage(self.Chapter)
self:UpdateTrueAndFalseStage()
-- self:InitAutoChangeBgComponents()
-- CS.XTool.WaitForEndOfFrame(function()
-- self:RefreshAutoChangeBgStageIndex()
-- end)
end
2024-09-01 20:49:41 +00:00
function XUiGridChapter:UpdateTrueAndFalseStage()
-- 屏蔽据点战
if not self.Chapter.Difficult or self.Chapter.Difficult == XDataCenter.FubenManager.DifficultNightmare then
return
end
local stageTransformCfg = XFubenMainLineConfigs.GetStageTransformsByChapterId(self.Chapter.ChapterId)
for _, config in pairs(stageTransformCfg) do
local beforeStageId = config.BeforeStageId
local afterStageId = config.AfterStageId
local beforeIndex = table.indexof(self.NormalStageList, beforeStageId)
local afterIndex = table.indexof(self.NormalStageList, afterStageId)
if not XTool.IsNumberValid(beforeIndex) or not XTool.IsNumberValid(afterIndex) then
break
end
local beforeStage = self.GridStageList[beforeIndex]
local afterStage = self.GridStageList[afterIndex]
if not beforeStage or not afterStage then
break
end
local afterStageInfo = XDataCenter.FubenManager.GetStageInfo(afterStageId)
if afterStageInfo.IsOpen then
if XConditionManager.CheckCondition(config.Condition) then
local isPlay = XDataCenter.FubenMainLineManager.CheckPlayTrueAndFalseStageAnim(beforeStageId, afterStageId)
if not afterStageInfo.Passed and not isPlay then
afterStage.Parent.gameObject:SetActiveEx(false)
self.TrueAndFalseAnimFunc = function()
local stageAnim = XUiHelper.TryGetComponent(self.Transform, string.format("Animation/Stage%dEnable", afterIndex))
if stageAnim then
stageAnim:PlayTimelineAnimation()
end
XDataCenter.FubenMainLineManager.SavePlayTrueAndFalseStageAnim(beforeStageId, afterStageId)
self.TrueAndFalseAnimFunc = nil
end
else
beforeStage.Parent.gameObject:SetActiveEx(false)
end
else
afterStage.Parent.gameObject:SetActiveEx(false)
end
end
end
end
-- 播放章节动画
function XUiGridChapter:PlayStageAnimation()
if self.TrueAndFalseAnimFunc then
self.TrueAndFalseAnimFunc()
end
end
-- 根据stageId选中
function XUiGridChapter:ClickStageGridByStageId(selectStageId)
if not selectStageId then return end
local IsEggStage = false
local stageInfo = XDataCenter.FubenManager.GetStageInfo(selectStageId)
if not stageInfo.IsOpen then return end
local index = 0
for i = 1, #self.NormalStageList do
local stageId = self.NormalStageList[i]
if selectStageId == stageId then
index = i
break
end
end
for i = 1, #self.EggStageList do
local stageId = self.EggStageList[i]
if selectStageId == stageId then
index = i
IsEggStage = true
break
end
end
if index ~= 0 then
if IsEggStage then
self:ClickEggStageGridByIndex(index)
else
self:ClickStageGridByIndex(index)
end
end
end
function XUiGridChapter:GetEggNum(stageList, eggStageCfg)
for k, v in pairs(stageList) do
if v == eggStageCfg.PreStageId[1] then --1为1号前置关卡
return k
end
end
return 0
end
2024-09-01 20:49:41 +00:00
-- 检测当前关卡是否显示
function XUiGridChapter:CheckCurrentStageShow(stageCfg, stageInfo)
-- 是否开启
local isOpen = stageInfo.IsOpen
-- 是否隐藏
local isHide = false
local disappearCondition = stageCfg.DisappearCondition or 0
if XTool.IsNumberValid(disappearCondition) then
isHide = XConditionManager.CheckCondition(disappearCondition)
end
return isOpen and not isHide
end
function XUiGridChapter:SetStageList()
if self.NormalStageList == nil then
XLog.Error("Chapter have no id " .. self.Chapter.ChapterId)
return
end
-- 初始化副本显示列表i作为order id从1开始
for i = 1, #self.NormalStageList do
local stageId = self.NormalStageList[i]
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
2024-09-01 20:49:41 +00:00
local isShow = self:CheckCurrentStageShow(stageCfg, stageInfo)
if isShow or self.IsOnZhouMu then
local grid = self.GridStageList[i]
if not grid then
local uiName
if stageInfo.Type == XDataCenter.FubenManager.StageType.ActivtityBranch then
uiName = "GridBranchStage"
elseif stageInfo.Type == XDataCenter.FubenManager.StageType.ActivityBossSingle then
uiName = "GridActivityBossSingleStage"
elseif stageInfo.Type == XDataCenter.FubenManager.StageType.RepeatChallenge then
uiName = "GridRepeatChallengeStage"
else
uiName = "GridStage"
end
uiName = stageCfg.StageGridStyle and uiName .. stageCfg.StageGridStyle or uiName
local parent = self.PanelStageContent.transform:Find("Stage" .. i)
local prefabName = CS.XGame.ClientConfig:GetString(uiName)
local prefab = parent:LoadPrefab(prefabName)
grid = XUiGridStage.New(self.RootUi, prefab, handler(self, self.ClickStageGrid), XFubenConfigs.FUBENTYPE_NORMAL, false, self.IsOnZhouMu)
grid.Parent = parent
self.GridStageList[i] = grid
end
grid:UpdateStageMapGrid(stageCfg, self.Chapter.OrderId)
grid.Parent.gameObject:SetActive(true)
self:SetLineActive(i, true)
--平行动画组Stage判断(主线18)
if i > 1 and XDataCenter.FubenMainLineManager.CheckStageIsParallelAnimeGroup(self.Chapter, i) then
local stageTrans = grid.Parent
local bindLineTrans = self.LineList[i-1]
local clearBlueImgTrans = grid.Transform:Find("PanelKillParent")
local clearRedImgTrans = grid.Parent:Find("Image")
if stageInfo.Passed then --如果通关
--将原有的Clear图标替换成动画显示的
clearBlueImgTrans.gameObject:SetActive(false)
clearRedImgTrans.gameObject:SetActive(true)
clearRedImgTrans:SetAsLastSibling()
-- 首通 Stage动画 判断动画是否播放过
if not XSaveTool.GetData(string.format("%d%dStageAnime", XPlayer.Id, stageId)) and not self.StageAnimFun then
clearRedImgTrans.gameObject:SetActive(false)
self.StageAnimFun = function ()
clearRedImgTrans.gameObject:SetActive(true)
local stageAnimeTrans = self.Transform:Find(string.format("Animation/Stage%dImageEnable",i))
stageAnimeTrans:PlayTimelineAnimation()
XSaveTool.SaveData(string.format("%d%dStageAnime", XPlayer.Id, stageId), 1)
self.StageAnimFun = nil
end
end
else -- 没通关
clearRedImgTrans.gameObject:SetActive(false)
-- 首次解锁 line动画 判断动画是否播过
if not XSaveTool.GetData(string.format("%d%dLineAnime", XPlayer.Id, stageId)) and not self.LineAnimFun then
stageTrans.gameObject:SetActive(false)
bindLineTrans.gameObject:SetActive(false)
self.LineAnimFun = function ()
stageTrans.gameObject:SetActive(true)
bindLineTrans.gameObject:SetActive(true)
local lineAnimeTrans = self.Transform:Find(string.format("Animation/Line%dEnable",i-1))
lineAnimeTrans:PlayTimelineAnimation()
XSaveTool.SaveData(string.format("%d%dLineAnime", XPlayer.Id, stageId), 1)
self.LineAnimFun = nil
end
end
end
end
end
end
for i = 1, #self.EggStageList do
local stageId = self.EggStageList[i].Id
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
if stageInfo.IsOpen then
if XDataCenter.FubenManager.GetUnlockHideStageById(stageId) then
local grid = self.GridEggStageList[i]
if not grid then
local uiName = "GridStageSquare"
local parentsParent = self.PanelStageContent.transform:Find("Stage" .. self.EggStageList[i].Num)
local parent = self.PanelStageContent.transform:Find("Stage" .. self.EggStageList[i].Num .. "/EggStage")
local prefabName = CS.XGame.ClientConfig:GetString(uiName)
local prefab = parent:LoadPrefab(prefabName)
grid = XUiGridStage.New(self.RootUi, prefab, handler(self, self.ClickStageGrid), XFubenConfigs.FUBENTYPE_NORMAL)
grid.Parent = parentsParent
self.GridEggStageList[i] = grid
end
grid:UpdateStageMapGrid(stageCfg, self.Chapter.OrderId)
end
end
end
2024-09-01 20:49:41 +00:00
for i = 1, MAX_STAGE_COUNT do
if not self.GridStageList[i] then
local parent = self.PanelStageContent.transform:Find("Stage" .. i)
if parent then
parent.gameObject:SetActive(false)
end
2024-09-01 20:49:41 +00:00
self:SetLineActive(i, false)
end
end
-- 移动至ListView正确的位置
if self.BoundSizeFitter then
self.BoundSizeFitter:SetLayoutHorizontal()
end
end
function XUiGridChapter:SetLineActive(index, active)
local line = self.LineList[index - 1]
if line then
line.gameObject:SetActive(active)
end
end
-- 选中一个 stage grid
function XUiGridChapter:ClickStageGrid(grid)
local curGrid = self.CurStageGrid
if curGrid and curGrid.Stage.StageId == grid.Stage.StageId then
return
end
local stageInfo = XDataCenter.FubenManager.GetStageInfo(grid.Stage.StageId)
2024-09-01 20:49:41 +00:00
local stageCfg = XDataCenter.FubenManager.GetStageCfg(grid.Stage.StageId)
local isUnlock = grid:CheckCurrentStageUnlock(stageCfg, stageInfo)
if not isUnlock then
XUiManager.TipMsg(XDataCenter.FubenManager.GetFubenOpenTips(grid.Stage.StageId))
return
end
-- 选中回调
if self.ShowStageCb then
self.ShowStageCb(grid.Stage, grid.ChapterOrderId)
end
if stageInfo.Type == XDataCenter.FubenManager.StageType.ActivityBossSingle then
return
end
-- 取消上一个选择
if curGrid then
curGrid:SetStageActive()
curGrid:SetStoryStageActive()
end
-- 选中当前选择
grid:SetStageSelect()
grid:SetStoryStageSelect()
if not self.IsOnZhouMu then
-- 滚动容器自由移动
self.ScrollRect.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Unrestricted
-- 面板移动
self:PlayScrollViewMove(grid)
end
self.CurStageGrid = grid
end
-- 返回滚动容器是否动画回弹
function XUiGridChapter:CancelSelect()
if not self.CurStageGrid then
return false
end
self.CurStageGrid:SetStageActive()
self.CurStageGrid:SetStoryStageActive()
self.CurStageGrid = nil
if self.HideStageCb then
self.HideStageCb()
end
return self:ScrollRectRollBack()
end
function XUiGridChapter:PlayScrollViewMove(grid)
-- 动画
local gridTf = grid.Parent.gameObject:GetComponent("RectTransform")
local diffX = gridTf.localPosition.x + self.PanelStageContent.localPosition.x
if diffX < XDataCenter.FubenMainLineManager.UiGridChapterMoveMinX or diffX > XDataCenter.FubenMainLineManager.UiGridChapterMoveMaxX then
local tarPosX = XDataCenter.FubenMainLineManager.UiGridChapterMoveTargetX - gridTf.localPosition.x
local tarPos = self.PanelStageContent.localPosition
tarPos.x = tarPosX
XLuaUiManager.SetMask(true)
XUiHelper.DoMove(self.PanelStageContent, tarPos, XDataCenter.FubenMainLineManager.UiGridChapterMoveDuration, XUiHelper.EaseType.Sin, function()
XLuaUiManager.SetMask(false)
end)
end
end
function XUiGridChapter:IsEggStage(stageCfg)
return stageCfg.StageType == XFubenConfigs.STAGETYPE_STORYEGG or stageCfg.StageType == XFubenConfigs.STAGETYPE_FIGHTEGG
end
-- 模拟点击一个关卡
function XUiGridChapter:ClickStageGridByIndex(index)
local grid = self.GridStageList[index]
self:ClickStageGrid(grid)
end
function XUiGridChapter:ClickEggStageGridByIndex(index)
local grid = self.GridEggStageList[index]
self:ClickStageGrid(grid)
end
function XUiGridChapter:Show()
if self.GameObject.activeSelf == true then return end
self.GameObject:SetActive(true)
end
function XUiGridChapter:Hide()
if not self.GameObject:Exist() or self.GameObject.activeSelf == false then return end
self.GameObject:SetActive(false)
end
function XUiGridChapter:PlayParallelAnime()
if self.StageAnimFun then
self.StageAnimFun()
end
if self.LineAnimFun then
--平行动画
self.LineAnimFun()
end
end
function XUiGridChapter:OnEnable()
if self.IsOnZhouMu then
local animaState = XDataCenter.FubenZhouMuManager.CheckPlayTipAnima(self.RootUi.ZhouMuId, self.zhouMuChapterId, self.OriLastStageIsPass)
if animaState == XFubenZhouMuConfigs.EnumZhouMuTipAnima.PlayStart then
-- 新周目开启动画
self.RootUi:PlayAnimation("MultipleWeekBegin")
elseif animaState == XFubenZhouMuConfigs.EnumZhouMuTipAnima.PlayEndStart then
-- 先播放当前周目结束动画,然后切换到新周目,再播放新周目开启动画
self.RootUi:PlayAnimation("MultipleWeekEnd", function()
self.RootUi:OnBtnSwitch1MultipleWeeksClick()
self.RootUi:PlayAnimation("MultipleWeekBegin")
end)
elseif animaState == XFubenZhouMuConfigs.EnumZhouMuTipAnima.PlayEnd then
-- 周目结束动画
self.RootUi:PlayAnimation("MultipleWeekEnd")
end
-- 在检查完是否播放动画后更新标志
self.zhouMuChapterId = XDataCenter.FubenZhouMuManager.GetZhouMuChapterIdByZhouMuId(self.RootUi.ZhouMuId)
local lastStage = XFubenZhouMuConfigs.GetZhouMuChapterLastStage(self.zhouMuChapterId)
self.OriLastStageIsPass = XDataCenter.FubenManager.CheckStageIsPass(lastStage)
end
if self.Enabled then
return
end
if self.GridStageList then
for _, v in pairs(self.GridStageList) do
v:OnEnable()
end
end
if self.GridEggStageList then
for _, v in pairs(self.GridEggStageList) do
v:OnEnable()
end
end
self.Enabled = true
end
function XUiGridChapter:OnDisable()
if not self.Enabled then
return
end
if self.GridStageList then
for _, v in pairs(self.GridStageList) do
v:OnDisable()
end
end
if self.GridEggStageList then
for _, v in pairs(self.GridEggStageList) do
v:OnDisable()
end
end
self.Enabled = false
end
return XUiGridChapter