PGRData/Script/matrix/xui/xuifubenshortstory/XUiGridStoryChapterDP.lua

590 lines
21 KiB
Lua
Raw Normal View History

local XUiGridStage = require("XUi/XUiFubenMainLineChapter/XUiGridStage")
local XUiGridStoryChapterDP = XClass(nil, "XUiGridStoryChapterDP")
local MAX_STAGE_COUNT = CS.XGame.ClientConfig:GetInt("MainLineStageMaxCount")
function XUiGridStoryChapterDP: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
--配置的格子位移超过某个阀值时,更换背景图片
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
end
function XUiGridStoryChapterDP:GetColors()
return self.Colors
end
function XUiGridStoryChapterDP: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
end
function XUiGridStoryChapterDP: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("XUiGridStoryChapterDP:RefreshAutoChangeBgStageIndex error:stage not exist,stageIndex is:" .. stageIndex)
return
end
local stageParent = stageTransform:GetComponent("RectTransform")
if XTool.UObjIsNil(stageParent) then
XLog.Error("XUiGridStoryChapterDP: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 XUiGridStoryChapterDP:Update()
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 XUiGridStoryChapterDP:OnDragProxy(dragType)
if dragType == 0 then
self:OnScrollRectBeginDrag()
elseif dragType == 2 then
self:OnScrollRectEndDrag()
end
end
function XUiGridStoryChapterDP:OnScrollRectBeginDrag()
if self:CancelSelect() then
self.ScrollRect.enabled = false
end
end
function XUiGridStoryChapterDP:OnScrollRectEndDrag()
self.ScrollRect.enabled = true
end
-- auto
-- Automatic generation of code, forbid to edit
function XUiGridStoryChapterDP:InitAutoScript()
self:AutoInitUi()
self:AutoAddListener()
end
function XUiGridStoryChapterDP: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 XUiGridStoryChapterDP:RegisterClickEvent(uiNode, func)
if func == nil then
XLog.Error("XUiGridStoryChapterDP:RegisterClickEvent函数参数错误参数func不能为空")
return
end
if type(func) ~= "function" then
XLog.Error("XUiGridStoryChapterDP:RegisterClickEvent函数错误, 参数func需要是function类型, func的类型是" .. type(func))
end
local listener = function(...)
func(self, ...)
end
CsXUiHelper.RegisterClickEvent(uiNode, listener)
end
function XUiGridStoryChapterDP:AutoAddListener()
--self:RegisterClickEvent(self.SViewStageList, self.OnSViewStageListClick)
end
-- auto
function XUiGridStoryChapterDP: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 XUiGridStoryChapterDP: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 XUiGridStoryChapterDP: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 XUiGridStoryChapterDP: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 posX = gridTf.localPosition.x - self.RectTransform.rect.width / 2
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)
end
-- chapter 组件内容更新
function XUiGridStoryChapterDP:UpdateChapterGrid(data)
self.ChapterId = data.ChapterId
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:InitAutoChangeBgComponents()
CS.XTool.WaitForEndOfFrame(function()
self:RefreshAutoChangeBgStageIndex()
end)
end
-- 根据stageId选中
function XUiGridStoryChapterDP: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 XUiGridStoryChapterDP: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 XUiGridStoryChapterDP:SetStageList()
if self.NormalStageList == nil then
XLog.Error("Chapter have no id " .. self.ChapterId)
return
end
local orderId = XFubenShortStoryChapterConfigs.GetChapterOrderIdByChapterId(self.ChapterId)
-- 初始化副本显示列表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)
if stageInfo.IsOpen 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, orderId)
grid.Parent.gameObject:SetActiveEx(true)
self:SetLineActive(i, true)
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, orderId)
end
end
end
local activeStageCount = #self.GridStageList
for i = activeStageCount + 1, MAX_STAGE_COUNT do
local parent = self.PanelStageContent.transform:Find("Stage" .. i)
if parent then
parent.gameObject:SetActiveEx(false)
end
self:SetLineActive(i, false)
end
-- 移动至ListView正确的位置
if self.BoundSizeFitter then
self.BoundSizeFitter:SetLayoutHorizontal()
end
end
function XUiGridStoryChapterDP:SetLineActive(index, active)
local line = self.LineList[index - 1]
if line then
line.gameObject:SetActiveEx(active)
end
end
-- 选中一个 stage grid
function XUiGridStoryChapterDP: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)
if not stageInfo.Unlock 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 XUiGridStoryChapterDP: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 XUiGridStoryChapterDP: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 XUiGridStoryChapterDP:IsEggStage(stageCfg)
return stageCfg.StageType == XFubenConfigs.STAGETYPE_STORYEGG or stageCfg.StageType == XFubenConfigs.STAGETYPE_FIGHTEGG
end
-- 模拟点击一个关卡
function XUiGridStoryChapterDP:ClickStageGridByIndex(index)
local grid = self.GridStageList[index]
self:ClickStageGrid(grid)
end
function XUiGridStoryChapterDP:ClickEggStageGridByIndex(index)
local grid = self.GridEggStageList[index]
self:ClickStageGrid(grid)
end
function XUiGridStoryChapterDP:Show()
if self.GameObject.activeSelf == true then return end
self.GameObject:SetActiveEx(true)
end
function XUiGridStoryChapterDP:Hide()
if not self.GameObject:Exist() or self.GameObject.activeSelf == false then return end
self.GameObject:SetActiveEx(false)
end
function XUiGridStoryChapterDP: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 XUiGridStoryChapterDP: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 XUiGridStoryChapterDP