PGRData/Script/matrix/xui/xuidoubletowers/XUiDoubleTowers.lua

538 lines
18 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local CSXTextManagerGetText = CS.XTextManager.GetText
local StageState = XDoubleTowersConfigs.StageState
local CHILD_DETAIL_UI_NAME = "UiDoubleTowersDetail"
local SPECIAL_DOOR_INDEX = 0
local UI_DOOR_AMOUNT = 8
local UI_DOOR_BORDER = 50
local FOCUS_TIME = 0.5
---@class XUiDoubleTowers:XLuaUi
local XUiDoubleTowers = XLuaUiManager.Register(XLuaUi, "UiDoubleTowers")
--region init
function XUiDoubleTowers:Ctor()
self._Timer = false
self._PlaceDoorTimer = false
self._SelectedGroupIndex = false
self._FocusGroupIndex = false
---@type XUiDoubleTowersDoor[]
self._UiDoor = {}
self._DragAreaComponent = false
self._FocusOffset = false
self._CenterOffset = false
end
function XUiDoubleTowers:OnStart()
end
function XUiDoubleTowers:OnAwake()
self:Init()
self:InitCoinUi()
-- 禁止玩家操作
self:SetDragEnabled(false)
end
function XUiDoubleTowers:OnEnable()
self:StartTimer()
self:AddListeners()
self:CheckSlotRedPoint()
self:CheckTaskRedPoint()
for i = 1, #self._UiDoor do
self._UiDoor[i]:OnEnable()
end
-- 屏蔽排行榜红点显示
self.BtnGradient:ShowReddot(false)
self:OpenNextStageAfterFight()
end
function XUiDoubleTowers:OnDisable()
self:StopTimer()
self:RemoveListeners()
for i = 1, #self._UiDoor do
self._UiDoor[i]:OnDisable()
end
end
-- 通关后打开下一关
function XUiDoubleTowers:OpenNextStageAfterFight()
local justPassedStageId = XDataCenter.DoubleTowersManager.GetJustPassedStage()
if justPassedStageId then
local nextStageId = XDataCenter.DoubleTowersManager.GetNextStageId(justPassedStageId)
if nextStageId and XDataCenter.DoubleTowersManager.IsStageCanChallenge(nextStageId) then
self:OpenStage(nextStageId)
else
-- 找不到下一关,重复打开
self:OpenStage(justPassedStageId)
end
end
end
function XUiDoubleTowers:Init()
self:InitViews()
self:RegisterButtonClick()
end
function XUiDoubleTowers:AddListeners()
XEventManager.AddEventListener(XEventId.EVENT_DOUBLE_TOWERS_OPEN_DETAIL, self.OpenStageDetail, self)
XEventManager.AddEventListener(XEventId.EVENT_DOUBLE_TOWERS_FOCUS, self.FocusDoor, self)
XEventManager.AddEventListener(XEventId.EVENT_DOUBLE_TOWERS_ON_OPENED_ROOM, self.OnRoomOpened, self)
XEventManager.AddEventListener(XEventId.EVENT_DOUBLE_TOWERS_UPDATE_GATHER, self.UpdateGather, self)
XEventManager.AddEventListener(XEventId.EVENT_DOUBLE_TOWERS_OPEN_STAGE, self.OpenStage, self)
XEventManager.AddEventListener(XEventId.EVENT_DOUBLE_TOWERS_SLOT_UNLOCK, self.CheckSlotRedPoint, self)
end
function XUiDoubleTowers:RemoveListeners()
XEventManager.RemoveEventListener(XEventId.EVENT_DOUBLE_TOWERS_OPEN_DETAIL, self.OpenStageDetail, self)
XEventManager.RemoveEventListener(XEventId.EVENT_DOUBLE_TOWERS_FOCUS, self.FocusDoor, self)
XEventManager.RemoveEventListener(XEventId.EVENT_DOUBLE_TOWERS_ON_OPENED_ROOM, self.OnRoomOpened, self)
XEventManager.RemoveEventListener(XEventId.EVENT_DOUBLE_TOWERS_UPDATE_GATHER, self.UpdateGather, self)
XEventManager.RemoveEventListener(XEventId.EVENT_DOUBLE_TOWERS_OPEN_STAGE, self.OpenStage, self)
XEventManager.RemoveEventListener(XEventId.EVENT_DOUBLE_TOWERS_SLOT_UNLOCK, self.CheckSlotRedPoint, self)
end
--endregion
--region click
function XUiDoubleTowers:RegisterButtonClick()
-- back and main
self:BindExitBtns(self.BtnBack, self.BtnMainUi)
-- 任务
self:RegisterClickEvent(self.BtnMileage, self.OnClickTaskBtn)
-- 排行榜
self:RegisterClickEvent(self.BtnGradient, self.OnClickRankBtn)
-- 部署成员
self:RegisterClickEvent(self.BtnDeploy, self.OnClickDeployBtn)
-- 收菜
self:RegisterClickEvent(self.BtnTreasure, self.OnClickGatherBtn)
-- 图文教学界面
self:BindHelpBtn(self.BtnHelp, XDataCenter.DoubleTowersManager.GetHelpKey())
-- 关闭detail界面
self:RegisterClickEvent(self.BtnCloseDetail, self.OnClickBtnCloseDetail)
-- 普通关卡
for groupIndex = 1, UI_DOOR_AMOUNT do
local uiDoor = self:GetUiDoor(groupIndex)
local buttonComponent = uiDoor:GetButtonComponent()
self:RegisterClickEvent(
uiDoor:GetButtonComponent(),
function()
self:onDoorBtnClick(groupIndex)
end
)
end
-- 特殊关卡
local uiDoor = self:GetUiDoor(SPECIAL_DOOR_INDEX)
self:RegisterClickEvent(
uiDoor:GetButtonComponent(),
function()
self:onSpecialDoorBtnClick()
end
)
end
function XUiDoubleTowers:onSpecialDoorBtnClick()
local stageId = XDataCenter.DoubleTowersManager.GetSpecialStageId()
if not XDataCenter.DoubleTowersManager.IsStageCanChallenge(stageId) then
XUiManager.TipErrorWithKey("DoubleTowersAllStageNotClear")
return
end
self:OpenStageDetail(stageId)
self:SetDoorSelected(SPECIAL_DOOR_INDEX)
XEventManager.DispatchEvent(XEventId.EVENT_DOUBLE_TOWERS_FOCUS, SPECIAL_DOOR_INDEX)
end
function XUiDoubleTowers:OnClickRankBtn()
if not XDataCenter.DoubleTowersManager.IsSpecialGroupUnlock() then
XUiManager.TipErrorWithKey("DoubleTowersLockRank")
-- return 策划要求可以打开,但伴随提示
end
XDataCenter.DoubleTowersManager.RequestDoubleTowerGetRank(
function()
XLuaUiManager.Open("UiDoubleTowersRank")
end
)
end
function XUiDoubleTowers:CheckTaskRedPoint()
self.BtnMileage:ShowReddot(XDataCenter.TaskManager.GetIsRewardForEx(TaskType.DoubleTower))
end
function XUiDoubleTowers:OnClickTaskBtn()
XLuaUiManager.Open(
"UiFubenTaskReward",
TaskType.DoubleTower,
nil,
function()
self:CheckTaskRedPoint()
end
)
end
function XUiDoubleTowers:OnClickDeployBtn()
XLuaUiManager.Open("UiDoubleTowersDeploy")
end
function XUiDoubleTowers:OnClickGatherBtn()
local canGatherCoins = XDataCenter.DoubleTowersManager.GetCanGatherCoins()
if canGatherCoins <= 0 then
XUiManager.TipText("DoubleTowersGatherFail")
return
end
-- 请求收菜
XDataCenter.DoubleTowersManager.RequestGatherCoins()
end
function XUiDoubleTowers:OnClickBtnCloseDetail()
self:ClearDoorSelected()
end
--endregion
--region 收菜 gather
function XUiDoubleTowers:StartTimer()
if self._Timer then
return
end
self:UpdateGather()
self._Timer =
XScheduleManager.ScheduleForever(
function()
self:UpdateGather()
end,
XScheduleManager.SECOND
)
end
function XUiDoubleTowers:UpdateGather()
if not self:UpdateTime() then
return
end
self:UpdateCoin()
self:CheckRedPoint()
end
function XUiDoubleTowers:StopTimer()
if not self._Timer then
return
end
XScheduleManager.UnSchedule(self._Timer)
self._Timer = false
end
-- set coin icon
function XUiDoubleTowers:InitCoinUi()
local ImgCoin =
XUiHelper.TryGetComponent(self.Transform, "SafeAreaContentPane/PanelProgress/PanelTool/RImgTool1", "RawImage")
local itemId = XDataCenter.DoubleTowersManager.GetCoinItemId()
local item = XDataCenter.ItemManager.GetItem(itemId)
ImgCoin:SetRawImage(XDataCenter.ItemManager.GetItemIcon(itemId))
end
function XUiDoubleTowers:UpdateTime()
local remainTime = XDataCenter.DoubleTowersManager.GetActivityRemainTime()
if remainTime <= 0 then
self:Close()
XUiManager.TipMsg(XUiHelper.GetText("ActivityAlreadyOver"))
return false
end
self.TimeTxt.text = XUiHelper.GetTime(remainTime)
return true
end
-- 收菜时间和币
function XUiDoubleTowers:UpdateCoin()
-- 代币
local canGatherCoins = XDataCenter.DoubleTowersManager.GetCanGatherCoins()
local maxCoinsAmount = XDataCenter.DoubleTowersManager.GetMaxCoinAmount()
local gatherReaminTime, gatherInterval = XDataCenter.DoubleTowersManager.GetGatherRemainTime()
-- 时间进度
self.ImgProgress.fillAmount = (gatherInterval - gatherReaminTime) / gatherInterval
-- 收菜时间
self.GatherTimeTxt.text = XUiHelper.GetTime(gatherReaminTime, XUiHelper.TimeFormatType.DOUBLE_TOWER)
if canGatherCoins == maxCoinsAmount then
self.CoinTxt.text = string.format("<color=#189affFF>%d/%d</color>", canGatherCoins, maxCoinsAmount)
return
end
self.CoinTxt.text = string.format("%d/%d", canGatherCoins, maxCoinsAmount)
end
--endregion
--region 关卡
function XUiDoubleTowers:onDoorBtnClick(groupIndex)
return self:SetDoorSelected(groupIndex)
end
-- 折叠 X之门
function XUiDoubleTowers:FoldDoor(groupIndex)
if not groupIndex then
return
end
local uiDoor = self:GetUiDoor(groupIndex)
if uiDoor then
uiDoor:Fold()
end
end
-- 展开 X之门
function XUiDoubleTowers:UnfoldDoor(groupIndex)
if not groupIndex then
return false
end
if not self:CheckGroupOpen(groupIndex) then
return
end
local groupBtn = self:GetUiDoor(groupIndex)
if groupBtn then
groupBtn:Unfold()
-- 只在展开的时候更新
local groupId = XDataCenter.DoubleTowersManager.GetGroupId(groupIndex)
groupBtn:UpdateStage(groupId)
end
return true
end
function XUiDoubleTowers:CheckGroupOpen(groupIndex)
local groupId = XDataCenter.DoubleTowersManager.GetGroupId(groupIndex)
local state = XDataCenter.DoubleTowersManager.GetGroupState(groupId)
-- 未解锁
if state == StageState.Lock then
local reason = XDataCenter.DoubleTowersManager.GetGroupLockReason(groupId)
if reason == XDoubleTowersConfigs.ReasonOfLockGroup.TimeLimit then
local groupName = XDoubleTowersConfigs.GetGroupName(groupId)
XUiManager.TipErrorWithKey("DoubleTowersStageTimeLimit", groupName)
return false
end
if reason == XDoubleTowersConfigs.ReasonOfLockGroup.PreconditionStageNotClear then
-- tip 请先通过 前置关卡名
local preconditionStageId = XDoubleTowersConfigs.GetGroupPreconditionStage(groupId)
if not XDataCenter.DoubleTowersManager.IsStageClear(preconditionStageId) then
local preconditionStageName = XDoubleTowersConfigs.GetStageName(preconditionStageId)
XUiManager.TipErrorWithKey("DoubleTowersPreconditionGroupNotClear", preconditionStageName)
else
XLog.Debug("[XUiDoubleTowers] other reason to lock group, please fix it")
end
return false
end
return false
end
return true
end
-- 可能是普通关卡or特殊关卡
function XUiDoubleTowers:GetUiDoor(groupIndex)
local uiDoor = self._UiDoor[groupIndex]
if not uiDoor then
if groupIndex == SPECIAL_DOOR_INDEX then
local uiStage = self.GridMajorTower
local XUiDoubleTowersSpecialDoor = require("XUi/XUiDoubleTowers/XUiDoubleTowersSpecialDoor")
uiDoor = XUiDoubleTowersSpecialDoor.New(uiStage)
else
local XUiDoubleTowersDoor = require("XUi/XUiDoubleTowers/XUiDoubleTowersDoor")
local uiStage = self.PanelTower:Find(string.format("Stage%s/GridTower", groupIndex))
if not uiStage then
XLog.Warning("[XUiDoubleTowers] 找不到门的ui门的序号是", groupIndex)
return false
end
uiDoor = XUiDoubleTowersDoor.New(uiStage)
end
self._UiDoor[groupIndex] = uiDoor
end
return uiDoor
end
function XUiDoubleTowers:InitDoor()
for groupIndex = 1, UI_DOOR_AMOUNT do
local uiDoor = self:GetUiDoor(groupIndex)
if uiDoor then
local groupId = XDataCenter.DoubleTowersManager.GetGroupId(groupIndex)
uiDoor:SetGroup(groupId)
-- 假如美术加了z强制归0否则随着每次focusz值会越来越大
if uiDoor.Transform.localPosition.z ~= 0 then
uiDoor.Transform.localPosition =
Vector3(uiDoor.Transform.localPosition.x, uiDoor.Transform.localPosition.y, 0)
end
end
end
end
function XUiDoubleTowers:UpdateSpecialDoor()
---@type XUiDoubleTowersSpecialDoor
local uiDoor = self:GetUiDoor(SPECIAL_DOOR_INDEX)
uiDoor:Refresh()
end
-- 选中关卡
function XUiDoubleTowers:SetDoorSelected(groupIndex)
if self._SelectedGroupIndex == groupIndex then
if groupIndex then
self:CheckGroupOpen(groupIndex)
self:SetDoorSelected(false)
end
--点击未解锁关卡重复弹tips
return false
end
-- 特殊关卡ui结构与普通关卡不同选中时就打开detail故不关闭
if groupIndex ~= SPECIAL_DOOR_INDEX then
self:CloseStageDetail()
-- local groupId = XDataCenter.DoubleTowersManager.GetGroupId(groupIndex)
-- 已通关
-- if XDataCenter.DoubleTowersManager.GetGroupState(groupId) == XDoubleTowersConfigs.StageState.Clear then
-- XUiManager.TipText("DoubleTowersPassed")
-- return
-- end
end
self:FoldDoor(self._SelectedGroupIndex)
self:UnfoldDoor(groupIndex)
self._SelectedGroupIndex = groupIndex
return true
end
function XUiDoubleTowers:ClearDoorSelected()
self:SetDoorSelected(false)
self:CloseStageDetail()
end
--endregion
--region ui
function XUiDoubleTowers:InitViews()
self._DragAreaComponent = self.PanelDrag:GetComponentInChildren(typeof(CS.XDragArea))
XUiPanelAsset.New(self, self.PanelAsset, XDataCenter.DoubleTowersManager.GetCoinItemId())
self:InitDoor()
self:UpdateSpecialDoor()
end
function XUiDoubleTowers:OpenStageDetail(stageId)
if not XLuaUiManager.IsUiShow(CHILD_DETAIL_UI_NAME) then
self:PlayAnimation("UiDisable")
self:OpenOneChildUi(CHILD_DETAIL_UI_NAME, self)
end
self:FindChildUiObj(CHILD_DETAIL_UI_NAME):SetStage(stageId)
end
function XUiDoubleTowers:CloseStageDetail()
XEventManager.DispatchEvent(XEventId.EVENT_DOUBLE_TOWERS_ON_DETAIL_CLOSED)
if XLuaUiManager.IsUiShow(CHILD_DETAIL_UI_NAME) then
self:PlayAnimation("UiEnable")
self:FindChildUiObj(CHILD_DETAIL_UI_NAME):CloseDetailWithAnimation()
self:FocusDoor(false)
end
end
function XUiDoubleTowers:OnRoomOpened()
-- self:ClearDoorSelected()
end
--endregion
--region 伪聚焦
function XUiDoubleTowers:OpenStage(stageId)
local groupIndex = XDoubleTowersConfigs.GetGroupIdByStageId(stageId)
local groupId = XDataCenter.DoubleTowersManager.GetGroupId(groupIndex)
if XDataCenter.DoubleTowersManager.IsSpecialGroup(groupId) then
self:onSpecialDoorBtnClick()
else
self:onDoorBtnClick(groupIndex)
XEventManager.DispatchEvent(XEventId.EVENT_DOUBLE_TOWERS_FOCUS, groupIndex)
XEventManager.DispatchEvent(XEventId.EVENT_DOUBLE_TOWERS_OPEN_DETAIL, stageId)
end
end
-- 这是虚假的禁止拖拽利用EndFocus函数在awake的时候focus一次但是不end后续每次focus前end一次
function XUiDoubleTowers:SetDragEnabled(value)
if value then
self._DragAreaComponent:EndFocus()
else
self:FocusCenter()
end
end
function XUiDoubleTowers:FocusDoor(groupIndex)
if groupIndex == self._FocusGroupIndex then
return
end
self._FocusGroupIndex = groupIndex
if groupIndex then
local door = self:GetUiDoor(groupIndex)
if door then
if not self._FocusOffset then
local screen = CS.UnityEngine.Screen
local leftPos =
CS.XUiManager.Instance.UiCamera:ScreenToWorldPoint(
Vector3(screen.width / 4, screen.height / 2, self.Transform.position.z)
)
local centerPos =
CS.XUiManager.Instance.UiCamera:ScreenToWorldPoint(
Vector3(screen.width / 2, screen.height / 2, self.Transform.position.z)
)
local offsetX = leftPos.x - centerPos.x
self._FocusOffset = Vector3(offsetX, 0, 0)
end
self:SetDragEnabled(true)
self._DragAreaComponent:StartFocus(
door.Transform.position,
self._DragAreaComponent.MaxScale,
FOCUS_TIME,
self._FocusOffset,
false
)
return
end
end
self:SetDragEnabled(true)
self:FocusCenter()
end
function XUiDoubleTowers:FocusCenter()
if not self._CenterOffset then
-- 保留美术设置的ui偏移
local screen = CS.UnityEngine.Screen
local centerPos =
CS.XUiManager.Instance.UiCamera:ScreenToWorldPoint(
Vector3(screen.width / 2, screen.height / 2, self.Transform.position.z)
)
local stageCenterTransform = self.PanelTower
local offsetPosition = stageCenterTransform.position
self._CenterOffset = centerPos - offsetPosition
end
-- 取一个居中transform的位置也可以是别的
local stageCenterTransform = self.PanelTower
local offset = Vector3.zero
self._DragAreaComponent:StartFocus(
stageCenterTransform.position + self._CenterOffset,
self._DragAreaComponent.MinScale,
FOCUS_TIME,
offset,
false
)
end
--endregion
--region red point
function XUiDoubleTowers:CheckRedPoint()
XRedPointManager.CheckOnce(self.OnCheckRedPoint, self, {XRedPointConditions.Types.CONDITION_DOUBLE_TOWERS})
end
function XUiDoubleTowers:OnCheckRedPoint(count)
--有可收集代币时,仅在内部显示红点
self.ImgRedPoint.gameObject:SetActive(count > 0 or XDataCenter.DoubleTowersManager.GetCanGatherCoins() > 0)
end
function XUiDoubleTowers:CheckSlotRedPoint()
XRedPointManager.CheckOnce(
self.OnCheckBtnDeployRedPoint,
self,
{XRedPointConditions.Types.CONDITION_DOUBLE_TOWERS_SLOT_UNLOCKED}
)
end
function XUiDoubleTowers:OnCheckBtnDeployRedPoint(count)
self.BtnDeploy:ShowReddot(count >= 0)
end
--endregion
return XUiDoubleTowers