PGRData/Script/matrix/xui/xuistronghold/XUiPanelStrongholdChapter.lua

181 lines
5.6 KiB
Lua
Raw Normal View History

local XUiGridStrongholdGroup = require("XUi/XUiStronghold/XUiGridStrongholdGroup")
local Lerp = CS.UnityEngine.Mathf.Lerp
local Vector3 = CS.UnityEngine.Vector3
local CSXScheduleManagerUnSchedule = XScheduleManager.UnSchedule
local ANIM_DURATION = 0.2
--关卡滑动动画持续时间
local CENTER_PERCENT = 0.3
--关卡要滑动到的位置占屏幕宽度百分比
local XUiPanelStrongholdChapter = XClass(nil, "XUiPanelStrongholdChapter")
function XUiPanelStrongholdChapter:Ctor(ui, clickStageCb, skipCb)
self.GameObject = ui.gameObject
self.Transform = ui.transform
self.GroupGrids = {}
self.ClickStageCb = clickStageCb
self.SkipCb = skipCb
XTool.InitUiObject(self)
self.ViewPort = self.Transform:FindTransform("ViewPort")
self.PanelStageContent = self.Transform:FindTransform("PanelStageContent")
self.ScrollRect = self.Transform:FindTransform("PaneStageList"):GetComponent("ScrollRect")
end
function XUiPanelStrongholdChapter:Refresh(chapterId)
local groupIds = XStrongholdConfigs.GetGroupIds(chapterId)
self.GroupIds = groupIds
for index, groupId in ipairs(groupIds) do
local grid = self.GroupGrids[index]
if not grid then
local prefabPath = XStrongholdConfigs.GetGroupPrefabPath(groupId)
local parent = self["Stage" .. index]
if not parent then
XLog.Error(
"XUiPanelStrongholdChapter:Refresh error:stage num error: chapterId is: " ..
chapterId .. ", index is:" .. index .. ", prefabPath: " .. prefabPath .. ", groupIds:",
groupIds
)
return
end
local go = parent:LoadPrefab(prefabPath)
local clickStageCb = handler(self, self.OnClickStage)
grid = XUiGridStrongholdGroup.New(go, index, clickStageCb, self.SkipCb)
self.GroupGrids[index] = grid
end
grid:Refresh(groupId)
grid.GameObject:SetActiveEx(true)
self:RefreshClearLine(index, groupId)
end
for index = #groupIds + 1, #self.GroupGrids do
local grid = self.GroupGrids[index]
if grid then
grid.GameObject:SetActiveEx(false)
end
end
end
function XUiPanelStrongholdChapter:RefreshClearLine(index, groupId)
local isFinished = XDataCenter.StrongholdManager.IsGroupFinished(groupId)
local clearLine = self["ClearLine" .. index]
local notClearLine = self["NotClearLine" .. index]
if clearLine then
clearLine.gameObject:SetActiveEx(isFinished)
end
if notClearLine then
notClearLine.gameObject:SetActiveEx(not isFinished)
end
local preClearLine = self["PreClearLine" .. index]
local preNotClearLine = self["PreNotClearLine" .. index]
if preClearLine and preNotClearLine then
local buffIds = XDataCenter.StrongholdManager.GetGroupBossBuffIds(groupId)
local isBuffActive
local preIsAllClear = true
for index, buffId in ipairs(buffIds) do
isBuffActive = XDataCenter.StrongholdManager.CheckBuffActive(buffId)
if isBuffActive then
preIsAllClear = false
break
end
end
preClearLine.gameObject:SetActiveEx(preIsAllClear)
preNotClearLine.gameObject:SetActiveEx(not preIsAllClear)
end
end
function XUiPanelStrongholdChapter:OnClickStage(gridIndex)
self.SelectGridIndex = gridIndex
if not gridIndex then
return
end
local groupId = self.GroupIds[gridIndex]
if self.ClickStageCb then
self.ClickStageCb(groupId)
end
for index, grid in pairs(self.GroupGrids) do
grid:SetSelect(index == gridIndex)
end
self.ScrollRect.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Unrestricted
self:CenterToGrid(gridIndex)
end
function XUiPanelStrongholdChapter:OnStageDetailClose()
self.SelectGridIndex = nil
self.ScrollRect.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Elastic
for index, grid in pairs(self.GroupGrids) do
grid:SetSelect(false)
end
end
function XUiPanelStrongholdChapter:CenterToGrid(gridIndex)
local parent = self["Stage" .. gridIndex]
if not parent then
return
end
local gridPosX = parent.transform.anchoredPosition3D.x
local limitX = self.ViewPort.rect.width * CENTER_PERCENT
local delta = limitX - gridPosX
local startPos = self.PanelStageContent.anchoredPosition3D
local endPosX = delta
local onRefresh = function(time)
if XTool.UObjIsNil(self.PanelStageContent) then
self:DestroyTimer()
return true
end
if startPos.x == endPosX then
return true
end
local posX = Lerp(startPos.x, endPosX, time)
self.PanelStageContent.anchoredPosition3D = Vector3(posX, startPos.y, startPos.z)
end
local onFinish = function()
XLuaUiManager.SetMask(false)
end
XLuaUiManager.SetMask(true)
self.Timer = XUiHelper.Tween(ANIM_DURATION, onRefresh, onFinish)
end
function XUiPanelStrongholdChapter:DestroyTimer()
if self.Timer then
CSXScheduleManagerUnSchedule(self.Timer)
self.Timer = nil
end
end
function XUiPanelStrongholdChapter:CenterToLastGrid()
local gridIndex = #self.GroupIds
self:OnClickStage(gridIndex)
end
function XUiPanelStrongholdChapter:OnSkipStage(skipGroupId)
for index, groupId in ipairs(self.GroupIds) do
if groupId == skipGroupId then
self:OnClickStage(index)
return
end
end
XLog.Error(string.format("当前组没有找到可跳转的关卡id。GroupId%s", skipGroupId))
end
return XUiPanelStrongholdChapter