PGRData/Script/matrix/xui/xuifubencouplecombat/childview/XUiPanelChapter.lua

320 lines
11 KiB
Lua
Raw Normal View History

local XUiPanelChapter = XClass(nil, "XUiPanelChapter")
local XUiStageItem = require("XUi/XUiFubenCoupleCombat/ChildItem/XUiStageItem")
local FUBEN_FIGHT_DETAIL = "UiFubenCoupleCombatDetail"
local XUguiDragProxy = CS.XUguiDragProxy
function XUiPanelChapter:Ctor(ui, rootUi, chapterIndex)
self.GameObject = ui.gameObject
self.Transform = ui.transform
self.RootUi = rootUi
XTool.InitUiObject(self)
XEventManager.AddEventListener(XEventId.EVENT_FUBEN_CLOSE_FUBENSTAGEDETAIL, self.CloseStageDetails, self)
self.StageGroup = {}
self.NeedReset = false
self.ChapterIndex = chapterIndex
self:InitPaneStageListActive()
end
function XUiPanelChapter:InitPaneStageListActive()
for i = XFubenCoupleCombatConfig.ChapterType.Normal, XFubenCoupleCombatConfig.ChapterType.Hard do
self["PaneStageList" .. i].gameObject:SetActiveEx(false)
end
end
function XUiPanelChapter:OnEnable()
if self.NeedReset then
self:SetPanelStageListMovementType(CS.UnityEngine.UI.ScrollRect.MovementType.Elastic)
self:ReopenAssetPanel()
else
self.NeedReset = true
end
self:DrawStagePanel()
end
function XUiPanelChapter:OnDestroy()
self.IsOpenDetails = nil
XEventManager.RemoveEventListener(XEventId.EVENT_FUBEN_CLOSE_FUBENSTAGEDETAIL, self.CloseStageDetails, self)
end
function XUiPanelChapter:SetUiData(chapterId, isAutoMove)
self.LastUnlockStage = 1
self.ChapterId = chapterId
self.StageIdList = XFubenCoupleCombatConfig.GetChapterStageIds(chapterId)
self.AssetPanel = self.RootUi.AssetPanel
local chapterType = XFubenCoupleCombatConfig.GetChapterType(chapterId)
self.ChapterType = chapterType
self.PaneStageList = self["PaneStageList" .. chapterType]
if not self.PaneStageList then
XLog.Error(string.format("未在配置中找到ChapterType = %s检查CoupleCombatChapter配置中的ChapterType字段Id为%s", chapterType, chapterId))
return
end
self.PaneStageList.gameObject:SetActiveEx(true)
self.PanelStageContent = self["PanelStageContent" .. chapterType]
self.PanelStageContentRaycast = self["PanelStageContentRaycast" .. chapterType]
self.PanelStageContentSizeFitter = self["PanelStageContentSizeFitter" .. chapterType]
local dragProxy = self.PaneStageList:GetComponent(typeof(XUguiDragProxy))
if not dragProxy then
dragProxy = self.PaneStageList.gameObject:AddComponent(typeof(XUguiDragProxy))
end
dragProxy:RegisterHandler(handler(self, self.OnDragProxy))
-- 关卡绘制
self:DrawStagePanel()
-- 移动至ListView正确的位置
if self.PanelStageContentSizeFitter then
self.PanelStageContentSizeFitter:SetLayoutHorizontal()
end
if isAutoMove then
self:MoveIntoStage(self.LastUnlockStage)
end
end
-- 关卡Panel绘制
function XUiPanelChapter:DrawStagePanel()
if not self.PaneStageList or not XTool.IsNumberValid(self.ChapterType) then
return
end
self:HandleStages()
if self.ChapterType == XFubenCoupleCombatConfig.ChapterType.Hard then
-- 困难模式10个关卡9条线计算
self:HandleStageLines(#self.StageIdList - 1)
self:UpdateHardNodeLines()
else
-- 普通模式6个关卡6条线计算
self:HandleStageLines(#self.StageIdList)
self:UpdateNorNodeLines()
end
end
-- 关卡处理
function XUiPanelChapter:HandleStages()
self.ChapterStages = {}
local stageCount = #self.StageIdList
for i = 1, stageCount do
local itemStage = self.PanelStageContent:Find(string.format("Stage%d", i))
if not itemStage then
XLog.Error("XUiPanelChapter:HandleStages() 函数错误: 游戏物体PanelStageContent下找不到名字为:" .. string.format("Stage%d", i) .. "的游戏物体")
return
end
-- 组件初始化
itemStage.gameObject:SetActiveEx(true)
self.StageGroup[i] = itemStage
self.ChapterStages[i] = XUiStageItem.New(self, itemStage, self.ChapterIndex)
self.ChapterStages[i]:UpdateNode(self.StageIdList[i], i, self.ChapterId)
end
--隐藏多余组件
local index = stageCount + 1
local itemStage = self.PanelStageContent:Find(string.format("Stage%d", index))
while itemStage do
itemStage.gameObject:SetActiveEx(false)
index = index + 1
itemStage = self.PanelStageContent:Find(string.format("Stage%d", index))
end
end
-- 线条处理
function XUiPanelChapter:HandleStageLines(stageListLength)
self.ChapterStageLine = {}
for i = 1, stageListLength do
local itemLine = self.PanelStageContent:Find(string.format("Line%d", i))
if not itemLine then
XLog.Error("XUiPanelChapter:SetUiData() error: prefab not found a child name:" .. string.format("Line%d", i))
return
end
itemLine.gameObject:SetActiveEx(false)
self.ChapterStageLine[i] = itemLine
end
-- 隐藏多余组件
local indexLine = #self.ChapterStageLine
local extraLine = self.PanelStageContent:Find(string.format("Line%d", indexLine))
while extraLine do
extraLine.gameObject:SetActiveEx(false)
indexLine = indexLine + 1
extraLine = self.PanelStageContent:Find(string.format("Line%d", indexLine))
end
end
-- 更新普通节点线条
function XUiPanelChapter:UpdateNorNodeLines()
if not self.StageIdList then return end
local stageLength = #self.StageIdList
for i = 1, stageLength - 1 do
local isHavenextStage = XDataCenter.FubenCoupleCombatManager.IsHaveNextStageIdByStageId(self.StageIdList[i])
local isUnlock = (isHavenextStage and XDataCenter.FubenManager.CheckStageIsPass(self.StageIdList[i])) or
(not isHavenextStage and XDataCenter.FubenManager.CheckStageIsUnlock(self.StageIdList[i]))
self:SetStageLineActive(i, isUnlock)
end
-- 处理最后合并线段
local isLastLineActive = XDataCenter.FubenManager.CheckStageIsPass(self.StageIdList[#self.ChapterStageLine - 1]) or
XDataCenter.FubenManager.CheckStageIsPass(self.StageIdList[#self.ChapterStageLine - 2])
self:SetStageLineActive(#self.ChapterStageLine, isLastLineActive)
for i = 1, stageLength do
local isUnlock = XDataCenter.FubenManager.CheckStageIsUnlock(self.StageIdList[i])
if isUnlock then
self.LastUnlockStage = i
end
end
end
-- 更新困难节点线条
function XUiPanelChapter:UpdateHardNodeLines()
if not self.StageIdList then return end
local stageLength = #self.StageIdList
for i = 1, stageLength - 1 do
local isOpen = XDataCenter.FubenManager.CheckStageOpen(self.StageIdList[i + 1])
self:SetStageLineActive(i, isOpen)
end
for i = 1, stageLength do
local isUnlock = XDataCenter.FubenManager.CheckStageIsUnlock(self.StageIdList[i])
if isUnlock then
self.LastUnlockStage = i
end
end
end
function XUiPanelChapter:SetStageLineActive(index, isActive)
if self.ChapterStageLine[index] then
self.ChapterStageLine[index].gameObject:SetActiveEx(isActive)
end
end
-- 选中关卡
function XUiPanelChapter:UpdateNodesSelect(stageId)
for i = 1, #self.StageIdList do
if self.ChapterStages[i] then
self.ChapterStages[i]:SetNodeSelect(self.StageIdList[i] == stageId)
end
end
end
-- 取消选中
function XUiPanelChapter:ClearNodesSelect()
for i = 1, #self.StageIdList do
if self.ChapterStages[i] then
self.ChapterStages[i]:SetNodeSelect(false)
end
end
self.IsOpenDetails = false
end
-- 打开剧情,战斗详情
function XUiPanelChapter:OpenStageDetails(stageId)
self.IsOpenDetails = true
--self.BtnCloseDetail.gameObject:SetActiveEx(true)
self.RootUi:OpenOneChildUi(FUBEN_FIGHT_DETAIL, self)
self.RootUi:FindChildUiObj(FUBEN_FIGHT_DETAIL):SetStageDetail(stageId)
if self.AssetPanel then
self.AssetPanel.GameObject:SetActiveEx(false)
end
self.PanelStageContentRaycast.raycastTarget = false
end
-- 关闭剧情,战斗详情
function XUiPanelChapter:CloseStageDetails()
self.IsOpenDetails = false
--self.BtnCloseDetail.gameObject:SetActiveEx(false)
self.PanelStageContentRaycast.raycastTarget = true
self:ClearNodesSelect()
self:ReopenAssetPanel()
self:SetPanelStageListMovementType(CS.UnityEngine.UI.ScrollRect.MovementType.Elastic)
end
function XUiPanelChapter:OnBtnCloseDetailClick()
self:CloseStageDetails()
end
function XUiPanelChapter:OnDragProxy(dragType)
if self.IsOpenDetails and dragType == 0 then
self:CloseStageDetails()
end
end
function XUiPanelChapter:PlayScrollViewMove(gridTransform)
self:SetPanelStageListMovementType(CS.UnityEngine.UI.ScrollRect.MovementType.Unrestricted)
local gridRect = gridTransform:GetComponent("RectTransform")
local diffX = gridRect.localPosition.x + self.PanelStageContent.localPosition.x
if diffX < XDataCenter.FubenMainLineManager.UiGridChapterMoveMinX or diffX > XDataCenter.FubenMainLineManager.UiGridChapterMoveMaxX then
local tarPosX = XDataCenter.FubenMainLineManager.UiGridChapterMoveTargetX - gridRect.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 XUiPanelChapter:MoveIntoStage(stageIndex)
local gridRect = self.StageGroup[stageIndex]
local diffX = gridRect.localPosition.x + self.PanelStageContent.localPosition.x
if diffX > CS.XResolutionManager.OriginWidth / 2 then
local tarPosX = (CS.XResolutionManager.OriginWidth / 4) - gridRect.localPosition.x
local tarPos = self.PanelStageContent.localPosition
tarPos.x = tarPosX
XLuaUiManager.SetMask(true)
self:SetPanelStageListMovementType(CS.UnityEngine.UI.ScrollRect.MovementType.Unrestricted)
XUiHelper.DoMove(self.PanelStageContent, tarPos, XDataCenter.FubenMainLineManager.UiGridChapterMoveDuration, XUiHelper.EaseType.Sin, function()
XLuaUiManager.SetMask(false)
self:SetPanelStageListMovementType(CS.UnityEngine.UI.ScrollRect.MovementType.Elastic)
end)
end
end
function XUiPanelChapter:EndScrollViewMove()
self:SetPanelStageListMovementType(CS.UnityEngine.UI.ScrollRect.MovementType.Elastic)
self:ReopenAssetPanel()
end
function XUiPanelChapter:ReopenAssetPanel()
if self.IsOpenDetails then
return
end
if self.AssetPanel then
self.AssetPanel.GameObject:SetActiveEx(true)
end
end
-- 背景
function XUiPanelChapter:SwitchFestivalBg(festivalTemplate)
if not festivalTemplate or not festivalTemplate.MainBackgound then
self.RImgFestivalBg.gameObject:SetActiveEx(false)
return
end
self.RImgFestivalBg:SetRawImage(festivalTemplate.MainBackgound)
end
-- 加载特效
function XUiPanelChapter:LoadEffect(effectUrl)
if not effectUrl or effectUrl == "" then
self.PanelEffect.gameObject:SetActiveEx(false)
return
end
self.PanelEffect.gameObject:LoadUiEffect(effectUrl)
self.PanelEffect.gameObject:SetActiveEx(true)
end
function XUiPanelChapter:SetPanelStageListMovementType(movementType)
if not self.PaneStageList then return end
self.PaneStageList.movementType = movementType
end
return XUiPanelChapter