PGRData/Script/matrix/xui/xuimultidim/XUiMultiDimSingleCopy.lua

366 lines
No EOL
13 KiB
Lua

local XUiGridChapter = require("XUi/XUiFubenMainLineChapter/XUiGridChapter")
local XUiMultiDimSingleCopy = XLuaUiManager.Register(XLuaUi, "UiMultiDimSingleCopy")
local XUguiDragProxy = CS.XUguiDragProxy
function XUiMultiDimSingleCopy:OnAwake()
self.LastOpenStage = nil
self.StageGroup = {}
self:InitUiView()
XEventManager.AddEventListener(XEventId.EVENT_ON_MULTIDIM_SINGLE_CHANGED, self.RefreshNodes, self) --通关刷新数据
end
function XUiMultiDimSingleCopy:OnEnable()
if self.LastOpenStage then
self:MoveIntoStage(self.LastOpenStage)
end
-- 线条处理
self:HandleStageLines()
-- 关卡处理
self:HandleStages()
-- -- 彩蛋处理
-- self:HandleEggStage()
end
function XUiMultiDimSingleCopy:InitUiView()
self.BtnBack.CallBack = function() self:OnBtnBackClick() end
self.BtnMainUi.CallBack = function() self:OnBtnMainUiClick() end
self.BtnCloseDetail.CallBack = function() self:OnBtnCloseDetailClick() end
self:BindHelpBtn(self.BtnHelp, "MultiDimMain")
end
function XUiMultiDimSingleCopy:OnStart(themeId)
self.ThemeId = themeId
self.ThemeDataCfg = XDataCenter.MultiDimManager.GetMultiDimThemeData(themeId)
self:SetUiData(self.ThemeDataCfg)
end
function XUiMultiDimSingleCopy:SetUiData(themeDataCfg)
-- 先检测时间
local now = XTime.GetServerNowTimestamp()
local endTimeSecond = XFunctionManager.GetEndTimeByTimeId(themeDataCfg.TimeId)
if endTimeSecond then
-- self.TxtDay.text = XUiHelper.GetTime(endTimeSecond - now, XUiHelper.TimeFormatType.ACTIVITY)
self:CreateActivityTimer(endTimeSecond)
end
-- 初始化prefab组件
local chapterGameObject = self.PanelChapter:LoadPrefab(themeDataCfg.FubenSinglePrefab)
local uiObj = chapterGameObject.transform:GetComponent("UiObject") --把加载出的副本prefab的UiObject添加到self
for i = 0, uiObj.NameList.Count - 1 do
self[uiObj.NameList[i]] = uiObj.ObjList[i]
end
if self.PaneStageList then
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))
end
self.StageIdList = self:GetFakeStages()
-- 线条处理
self:HandleStageLines()
-- 关卡处理
self:HandleStages()
-- -- 彩蛋处理
-- self:HandleEggStage()
-- 背景图片
self:SwitchBg(themeDataCfg)
-- 加载特效
self:LoadEffect(themeDataCfg.EffectUrl)
self.TxtChapterName.text = self.ThemeDataCfg.Name
local itemId = XDataCenter.MultiDimManager.GetActivityItemId()
self.AssetPanel = XUiHelper.NewPanelActivityAsset({ itemId }, self.PanelSpecialTool)
end
function XUiMultiDimSingleCopy:CreateActivityTimer(endTime)
self:StopActivityTimer()
self:UpdateTime(endTime)
self.ActivityTimer = XScheduleManager.ScheduleForever(function()
self:UpdateTime(endTime)
end, XScheduleManager.SECOND)
end
function XUiMultiDimSingleCopy:UpdateTime(endTime)
local now = XTime.GetServerNowTimestamp()
if now >= endTime then
XUiManager.TipText("MultiDimActivityEnd")
self:StopActivityTimer()
self:Close()
return
end
self.TxtDay.text = XUiHelper.GetTime(endTime - now, XUiHelper.TimeFormatType.ACTIVITY)
end
function XUiMultiDimSingleCopy:StopActivityTimer()
if self.ActivityTimer then
XScheduleManager.UnSchedule(self.ActivityTimer)
self.ActivityTimer = nil
end
end
function XUiMultiDimSingleCopy:HandleStages()
self.Stages = {}
for i = 1, #self.StageIdList do
local itemStage = self.PanelStageContent:Find(string.format("Stage%d", i))
if not itemStage then
XLog.Error("XUiMultiDimSingleCopy:HandleStages() 函数错误: 游戏物体PanelStageContent下找不到名字为:" .. string.format("Stage%d", i) .. "的游戏物体")
return
end
-- 组件初始化
itemStage.gameObject:SetActiveEx(true)
self.StageGroup[i] = itemStage
self.Stages[i] = XUiMultiDimSingleStageItem.New(self, itemStage)
self.Stages[i]:UpdateNode(self.ThemeId, self.StageIdList[i], i)
end
self:UpdateNodeLines()
-- 隐藏多余组件
local indexStage = #self.StageIdList + 1
local extraStage = self.PanelStageContent:Find(string.format("Stage%d", indexStage))
while extraStage do
extraStage.gameObject:SetActiveEx(false)
indexStage = indexStage + 1
extraStage = self.PanelStageContent:Find(string.format("Stage%d", indexStage))
end
end
function XUiMultiDimSingleCopy:HandleStageLines()
self.StageLine = {}
for i = 1, #self.StageIdList - 1 do
local itemLine = self.PanelStageContent:Find(string.format("Line%d", i))
if not itemLine then
XLog.Error("XUiMultiDimSingleCopy:SetUiData() error: prefab not found a child name:" .. string.format("Line%d", i))
return
end
itemLine.gameObject:SetActiveEx(false)
self.StageLine[i] = itemLine
end
-- 隐藏多余组件
local indexLine = #self.StageLine
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 XUiMultiDimSingleCopy:RefreshNodes()
if not self.ThemeDataCfg or not self.StageIdList then return end
for i = 1, #self.StageIdList do
self.Stages[i]:UpdateNode(self.ThemeDataCfg.Id, self.StageIdList[i], i)
end
self:UpdateNodeLines()
-- self:HandleEggStage()
end
-- 更新节点线条
function XUiMultiDimSingleCopy:UpdateNodeLines()
if not self.ThemeDataCfg or not self.StageIdList then return end
local stageLength = #self.StageIdList
for i = 2, stageLength do
local isOpen = XDataCenter.FubenManager.GetStageInfo(self.StageIdList[i]).IsOpen
self:SetStageLineActive(i - 1, isOpen)
if isOpen then
self.LastOpenStage = i
end
end
-- self:SetStageLineActive(1, false)
self:SetStageLineActive(stageLength, false)
end
function XUiMultiDimSingleCopy:SetStageLineActive(index, isActive)
if self.StageLine[index] then
self.StageLine[index].gameObject:SetActiveEx(isActive)
end
end
function XUiMultiDimSingleCopy:HandleEggStage()
local eggStageIndex = 1
local eggStageId = self.StageIdList[eggStageIndex]
local eggStageCfg = XDataCenter.FubenManager.GetStageCfg(eggStageId)
local eggStageInfo = XDataCenter.FubenManager.GetStageInfo(eggStageId)
local stageType = eggStageCfg.stageType
if eggStageCfg and stageType and ((stageType == XFubenConfigs.STAGETYPE_STORYEGG) or (stageType == XFubenConfigs.STAGETYPE_FIGHTEGG)) then
-- 彩蛋处理
local isUnlock = eggStageInfo.IsOpen
self.Stages[eggStageIndex].GameObject:SetActiveEx(isUnlock)
if isUnlock then
local preStageIds = eggStageCfg.PreStageId
if preStageIds and preStageIds[1] then
for i = 1, #self.StageIdList do
if preStageIds[1] == self.StageIdList[i] then
self.Stages[eggStageIndex]:ResetItemPosition(self.Stages[i].Transform.localPosition)
break
end
end
end
end
else
-- 非彩蛋
self.Stages[eggStageIndex].GameObject:SetActiveEx(false)
end
self.StageLine[eggStageIndex].gameObject:SetActiveEx(false)
end
-- 点击:选中关卡
function XUiMultiDimSingleCopy:UpdateNodesSelect(stageId)
local stageIds = self.StageIdList
for i = 1, #stageIds do
if self.Stages[i] then
self.Stages[i]:SetNodeSelect(stageIds[i] == stageId)
end
end
end
-- 取消选中
function XUiMultiDimSingleCopy:ClearNodesSelect()
for i = 1, #self.StageIdList do
if self.Stages[i] then
self.Stages[i]:SetNodeSelect(false)
end
end
self.IsOpenDetails = false
end
function XUiMultiDimSingleCopy:GetFakeStages()
local stageIds = {}
local stageIdList = XMultiDimConfig.GetMultiSingleStageListByThemeId(self.ThemeId)
if stageIdList and next(stageIdList) then
for i = 1, #stageIdList do
stageIds[i] = stageIdList[i]
end
-- local firstStage = self.ThemeDataCfg:GetStageByOrderIndex(1)
-- if not firstStage:GetIsEggStage() then
-- table.insert(stageIds, 1, stageIds[1])
-- end
end
return stageIds
end
-- 点击:打开战斗详情
function XUiMultiDimSingleCopy:OpenStageDetails(stageId, themeId)
local mStage = XMultiDimConfig.GetMultiSingleStageDataById(stageId)
if not mStage then return end
self.MStage = mStage
self.IsOpenDetails = true
self.BtnCloseDetail.gameObject:SetActiveEx(true)
self:OpenOneChildUi("UiMultiDimSingleCopyTips", self)
self:FindChildUiObj("UiMultiDimSingleCopyTips"):SetStageDetail(stageId, themeId)
self.PanelStageContentRaycast.raycastTarget = false
end
-- 关闭战斗详情
function XUiMultiDimSingleCopy:CloseStageDetails()
self.IsOpenDetails = false
self.BtnCloseDetail.gameObject:SetActiveEx(false)
if XLuaUiManager.IsUiShow("UiMultiDimSingleCopyTips") then
self:FindChildUiObj("UiMultiDimSingleCopyTips"):CloseDetailWithAnimation()
end
self.PanelStageContentRaycast.raycastTarget = true
self:ClearNodesSelect()
self:ReopenAssetPanel()
self:SetPanelStageListMovementType(CS.UnityEngine.UI.ScrollRect.MovementType.Elastic)
end
function XUiMultiDimSingleCopy:OnBtnCloseDetailClick()
self:CloseStageDetails()
end
function XUiMultiDimSingleCopy:OnDragProxy(dragType)
if self.IsOpenDetails and dragType == 0 then
self:CloseStageDetails()
end
end
function XUiMultiDimSingleCopy: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 XUiMultiDimSingleCopy:MoveIntoStage(stageIndex)
local gridRect = self.StageGroup[stageIndex]
local diffX = gridRect.localPosition.x + self.PanelStageContent.localPosition.x
local left = 0
if diffX > CS.XResolutionManager.OriginWidth / 2 - left then
local tarPosX = (CS.XResolutionManager.OriginWidth / 4) - gridRect.localPosition.x - left
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 XUiMultiDimSingleCopy:EndScrollViewMove()
self:SetPanelStageListMovementType(CS.UnityEngine.UI.ScrollRect.MovementType.Elastic)
self:ReopenAssetPanel()
end
function XUiMultiDimSingleCopy:ReopenAssetPanel()
if self.IsOpenDetails then
return
end
if self.AssetPanel then
self.AssetPanel.GameObject:SetActiveEx(true)
end
end
-- 背景
function XUiMultiDimSingleCopy:SwitchBg(themeDataCfg)
if not themeDataCfg or not themeDataCfg.FubenSingleMainBg then
self.RImgFestivalBg.gameObject:SetActiveEx(false)
return
end
self.RImgFestivalBg:SetRawImage(themeDataCfg.FubenSingleMainBg)
end
-- 加载特效
function XUiMultiDimSingleCopy: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 XUiMultiDimSingleCopy:SetPanelStageListMovementType(moveMentType)
if not self.PaneStageList then return end
self.PaneStageList.movementType = moveMentType
end
function XUiMultiDimSingleCopy:OnBtnMainUiClick()
XLuaUiManager.RunMain()
end
function XUiMultiDimSingleCopy:OnBtnBackClick()
self:Close()
end
function XUiMultiDimSingleCopy:OnDestroy()
self.IsOpenDetails = nil
self:StopActivityTimer()
XEventManager.RemoveEventListener(XEventId.EVENT_ON_MULTIDIM_SINGLE_CHANGED, self.RefreshNodes, self)
end