forked from endernon/PGRData
185 lines
No EOL
6.7 KiB
Lua
185 lines
No EOL
6.7 KiB
Lua
local XUiPartnerTeachingChapterContent = XClass(nil, "XUiPartnerTeachingChapterContent")
|
||
|
||
local XUiGridPartnerTeachingStage = require("XUi/XUiFubenPartnerTeaching/XUiGridPartnerTeachingStage")
|
||
|
||
function XUiPartnerTeachingChapterContent:Ctor(ui, chapterId)
|
||
self.GameObject = ui.gameObject
|
||
self.Transform = ui.transform
|
||
self.ChapterId = chapterId
|
||
|
||
self.LastOpenStage = nil
|
||
|
||
self.StageItemList = {} -- 关卡数组
|
||
self.LineItemList = {} -- 关卡线数组
|
||
|
||
self.StageClassList = {} -- 关卡类实例数组
|
||
self.StageIdList = XPartnerTeachingConfigs.GetChapterStageIds(chapterId) -- 关卡Id数组
|
||
|
||
XTool.InitUiObject(self)
|
||
self:InitComponent()
|
||
end
|
||
|
||
function XUiPartnerTeachingChapterContent:InitComponent()
|
||
-- 章节名称
|
||
self.TxtChapterName.text = XPartnerTeachingConfigs.GetChapterName(self.ChapterId)
|
||
|
||
-- 保存关卡与关卡线物体
|
||
self:FindItem("Stage%d", self.StageItemList)
|
||
self:FindItem("Line%d", self.LineItemList)
|
||
|
||
-- 实例化关卡类
|
||
local setLineCb = handler(self, self.SetLineActive)
|
||
for i, stageItem in ipairs(self.StageItemList) do
|
||
local stageClass = XUiGridPartnerTeachingStage.New(stageItem, i, setLineCb)
|
||
self.StageClassList[i] = stageClass
|
||
end
|
||
|
||
self:LoadAllStages()
|
||
end
|
||
|
||
---
|
||
--- 设置第 'index' 条关卡线的显隐
|
||
function XUiPartnerTeachingChapterContent:SetLineActive(index, isActive)
|
||
local line = self.LineItemList[index - 1]
|
||
if line then
|
||
line.gameObject:SetActiveEx(isActive)
|
||
end
|
||
end
|
||
|
||
---
|
||
--- 寻找'PanelStageContent'下的 'itemName+index' 物体,并保存在'saveList'
|
||
function XUiPartnerTeachingChapterContent:FindItem(itemName, saveList)
|
||
local i = 1
|
||
local item = self.PanelStageContent:Find(string.format(itemName, i))
|
||
while item do
|
||
table.insert(saveList, item)
|
||
i = i + 1
|
||
item = self.PanelStageContent:Find(string.format(itemName, i))
|
||
end
|
||
end
|
||
|
||
---
|
||
--- 关卡类根据 StageIdList 来加载对应的关卡预制
|
||
function XUiPartnerTeachingChapterContent:LoadAllStages()
|
||
local stageClassNum = #self.StageClassList
|
||
local stageIdNum = #self.StageIdList
|
||
if stageIdNum > stageClassNum then
|
||
XLog.Error(string.format("XUiPartnerTeachingChapterContent:LoadAllStages函数错误,PanelStageContent下的关卡数量少于%s个",
|
||
stageIdNum))
|
||
end
|
||
|
||
-- 如果stageClassNum > stageIdNum,多余的stageClass会拿到空的stageId,然后隐藏关卡与线条
|
||
for i, stageClass in ipairs(self.StageClassList) do
|
||
stageClass:LoadStagePrefab(self.ChapterId, self.StageIdList[i])
|
||
end
|
||
end
|
||
|
||
--------------------------------------------------------刷新-------------------------------------------------------------
|
||
function XUiPartnerTeachingChapterContent:Refresh()
|
||
-- 通关进度
|
||
local passNum, totalNum = XDataCenter.PartnerTeachingManager.GetChapterProgress(self.ChapterId)
|
||
self.TxtProgressNumber.text = string.format("%d/%d", passNum, totalNum)
|
||
|
||
for i, stageClass in ipairs(self.StageClassList) do
|
||
local isOpen = stageClass:Refresh()
|
||
if isOpen then
|
||
self.LastOpenStage = i
|
||
end
|
||
end
|
||
if self.PanelStageContentSizeFitter then
|
||
self.PanelStageContentSizeFitter:SetLayoutHorizontal()
|
||
end
|
||
self:MoveToLastStage()
|
||
end
|
||
|
||
---
|
||
--- 滑动到最后一个关卡
|
||
function XUiPartnerTeachingChapterContent:MoveToLastStage()
|
||
if self.LastOpenStage then
|
||
local gridRect = self.StageItemList[self.LastOpenStage]
|
||
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.PanelStageList.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Unrestricted
|
||
|
||
XUiHelper.DoMove(self.PanelStageContent, tarPos, XDataCenter.FubenMainLineManager.UiGridChapterMoveDuration, XUiHelper.EaseType.Sin, function()
|
||
XLuaUiManager.SetMask(false)
|
||
self.PanelStageList.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Elastic
|
||
|
||
end)
|
||
end
|
||
end
|
||
end
|
||
|
||
-------------------------------------------------------选择关卡----------------------------------------------------------
|
||
---
|
||
--- 选择关卡
|
||
function XUiPartnerTeachingChapterContent:SelectStage(stageId)
|
||
local index = self:FindStageIndex(stageId)
|
||
self:SetStageSelect(index, true)
|
||
self:PlayScrollViewMove(self.StageItemList[index])
|
||
end
|
||
|
||
---
|
||
--- 滑动关卡列表,使选择的关卡到达合适位置
|
||
function XUiPartnerTeachingChapterContent:PlayScrollViewMove(gridRect)
|
||
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)
|
||
self.PanelStageList.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Unrestricted
|
||
|
||
XUiHelper.DoMove(self.PanelStageContent, tarPos, XDataCenter.FubenMainLineManager.UiGridChapterMoveDuration, XUiHelper.EaseType.Sin, function()
|
||
XLuaUiManager.SetMask(false)
|
||
end)
|
||
end
|
||
end
|
||
|
||
---
|
||
--- 得到关卡 'stageId' 的索引
|
||
function XUiPartnerTeachingChapterContent:FindStageIndex(stageId)
|
||
for _, stageClass in ipairs(self.StageClassList) do
|
||
local classStageId = stageClass:GetStageId()
|
||
if classStageId == stageId then
|
||
return stageClass:GetIndex()
|
||
end
|
||
end
|
||
end
|
||
|
||
---
|
||
--- 取消选择关卡
|
||
function XUiPartnerTeachingChapterContent:CancelSelectStage()
|
||
if self.SelectStageIndex then
|
||
self:SetStageSelect(self.SelectStageIndex, false)
|
||
self.SelectStageIndex = nil
|
||
end
|
||
self:EndScrollViewMove()
|
||
end
|
||
|
||
---
|
||
--- 结束关卡列表滑动
|
||
function XUiPartnerTeachingChapterContent:EndScrollViewMove()
|
||
self.PanelStageList.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Elastic
|
||
end
|
||
|
||
---
|
||
--- 设置关卡的选择效果
|
||
function XUiPartnerTeachingChapterContent:SetStageSelect(index, isActive)
|
||
if not self.StageClassList[index] then
|
||
XLog.Error(string.format("XUiPartnerTeachingChapterContent:SetStageSelect函数错误,没有第%s个关卡的类实例", tostring(index)))
|
||
return
|
||
end
|
||
self.StageClassList[index]:SetSelect(isActive)
|
||
self.SelectStageIndex = index
|
||
end
|
||
|
||
return XUiPartnerTeachingChapterContent |