forked from endernon/PGRData
814 lines
No EOL
30 KiB
Lua
814 lines
No EOL
30 KiB
Lua
local XUiGridStage = require("XUi/XUiFubenMainLineChapter/XUiGridStage")
|
||
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
|
||
|
||
---@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
|
||
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)
|
||
|
||
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()
|
||
self.MainLineSkipStage:SetSkipStage(self.Chapter)
|
||
self:UpdateTrueAndFalseStage()
|
||
-- self:InitAutoChangeBgComponents()
|
||
|
||
-- CS.XTool.WaitForEndOfFrame(function()
|
||
-- self:RefreshAutoChangeBgStageIndex()
|
||
-- end)
|
||
end
|
||
|
||
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
|
||
|
||
-- 检测当前关卡是否显示
|
||
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)
|
||
|
||
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
|
||
|
||
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
|
||
|
||
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)
|
||
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 |