PGRData/Script/matrix/xui/xuifubenfashionstory/XUiFashionStoryChapter.lua

183 lines
6.3 KiB
Lua
Raw Normal View History

local XUiFashionStoryChapter = XClass(nil,"XUiFashionStoryChapter")
local XUiGridFashionStoryStage = require("XUi/XUiFubenFashionStory/XUiGridFashionStoryStage")
function XUiFashionStoryChapter:Ctor(ui,activityId)
self.GameObject = ui.gameObject
self.Transform = ui.transform
self.ActivityId = activityId
self.LastOpenStage = nil
self.StageItemList = {} -- 关卡数组
self.LineItemList = {} -- 关卡线数组
self.StageClassList = {} -- 关卡类实例数组
self.StageIdList = XFashionStoryConfigs.GetChapterStagesList(activityId) -- 关卡Id数组
XTool.InitUiObject(self)
self:InitComponent()
end
function XUiFashionStoryChapter:InitComponent()
-- 保存关卡与关卡线物体
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 = XUiGridFashionStoryStage.New(stageItem, i, setLineCb)
self.StageClassList[i] = stageClass
end
self:LoadAllStages()
end
---
--- 寻找'PanelStageContent'下的 'itemName+index' 物体,并保存在'saveList'
function XUiFashionStoryChapter: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
---
--- 设置第 'index' 条关卡线的显隐
function XUiFashionStoryChapter:SetLineActive(index, isActive)
local line = self.LineItemList[index - 1]
if line then
line.gameObject:SetActiveEx(isActive)
end
end
---
--- 关卡类根据 StageIdList 来加载对应的关卡预制
function XUiFashionStoryChapter:LoadAllStages()
local stageClassNum = #self.StageClassList
local stageIdNum = #self.StageIdList
if stageIdNum > stageClassNum then
XLog.Error(string.format("XUiFashionStoryChapter:LoadAllStages函数错误,PanelStageContent下的关卡数量少于%s个",
stageIdNum))
end
-- 如果stageClassNum > stageIdNum多余的stageClass会拿到空的stageId然后隐藏关卡与线条
for i, stageClass in ipairs(self.StageClassList) do
stageClass:LoadStagePrefab(self.ActivityId, self.StageIdList[i])
end
end
--------------------------------------------------------刷新-------------------------------------------------------------
function XUiFashionStoryChapter:Refresh(moveToLast)
for i, stageClass in ipairs(self.StageClassList) do
stageClass:Refresh()
local isOpen = stageClass:GetIsOpen()
if isOpen then
self.LastOpenStage = i
end
end
if self.PanelStageContentSizeFitter then
self.PanelStageContentSizeFitter:SetLayoutHorizontal()
end
if moveToLast then
self:MoveToLastStage()
end
end
---
--- 滑动到最后一个关卡
function XUiFashionStoryChapter: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 XUiFashionStoryChapter:SelectStage(stageId)
local index = self:FindStageIndex(stageId)
self:SetStageSelect(index, true)
self:PlayScrollViewMove(self.StageItemList[index])
end
---
--- 得到关卡 'stageId' 的索引
function XUiFashionStoryChapter:FindStageIndex(stageId)
for _, stageClass in ipairs(self.StageClassList) do
local classStageId = stageClass:GetStageId()
if classStageId == stageId then
return stageClass:GetIndex()
end
end
end
---
--- 滑动关卡列表,使选择的关卡到达合适位置
function XUiFashionStoryChapter: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
---
--- 取消选择关卡
function XUiFashionStoryChapter:CancelSelectStage()
if self.SelectStageIndex then
self:SetStageSelect(self.SelectStageIndex, false)
self.SelectStageIndex = nil
end
self:EndScrollViewMove()
end
---
--- 结束关卡列表滑动
function XUiFashionStoryChapter:EndScrollViewMove()
self.PanelStageList.movementType = CS.UnityEngine.UI.ScrollRect.MovementType.Elastic
end
---
--- 设置关卡的选择效果
function XUiFashionStoryChapter:SetStageSelect(index, isActive)
if not self.StageClassList[index] then
XLog.Error(string.format("XUiFashionStoryChapter:SetStageSelect函数错误没有第%s个关卡的类实例", tostring(index)))
return
end
self.StageClassList[index]:SetSelect(isActive)
self.SelectStageIndex = index
end
return XUiFashionStoryChapter