PGRData/Script/matrix/xui/xuiinvertcardgame/XUiInvertCardGamePanel.lua

327 lines
13 KiB
Lua

local tableInsert = table.insert
local Vector2 = CS.UnityEngine.Vector2
local CSTextManagerGetText = CS.XTextManager.GetText
local XUiInvertGamePanel = XClass(nil, "XUiInvertGamePanel")
local XUiInvertGameCardItem = require("XUi/XUiInvertCardGame/XUiInvertGameCardItem")
function XUiInvertGamePanel:Ctor(rootUi, ui)
self.GameObject = ui.gameObject
self.Transform = ui.transform
self.RectTransform = ui
self.RootUi = rootUi
XTool.InitUiObject(self)
self:Init()
end
function XUiInvertGamePanel:Init()
self.CardWidth = self.GridDraw.rect.width
self.CardHeight = self.GridDraw.rect.height
self.GamePanelWidth = self.Transform.rect.width
self.GamePanelHeight = self.Transform.rect.height
self.HalfGamePanelWidth = self.GamePanelWidth / 2
self.HalfGamePanelHeight = self.GamePanelHeight / 2
self.CardPool = {}
self.CardItems = {}
self.GridDrawRoot.gameObject:SetActiveEx(false)
end
function XUiInvertGamePanel:Refresh(stageEntity)
if stageEntity then
self.StageEntity = stageEntity
self.StageId = self.StageEntity:GetId()
local stageStatus = self.StageEntity:GetStatus()
if stageStatus == XInvertCardGameConfig.InvertCardGameStageStatusType.Lock then
return
elseif stageStatus == XInvertCardGameConfig.InvertCardGameStageStatusType.Process then
local startState = XDataCenter.InvertCardGameManager.GetStartStage(self.StageEntity)
if startState == XInvertCardGameConfig.InvertCardGameStartStage.NotStart then
self:RefreshGamePanelWithFinish() -- 没开始的时候用配置卡牌顺序刷新面板
self:RefreshMessagePanel()
return
end
local cardList = stageEntity:GetRandomCardList()
local datas = {}
for index, data in ipairs(cardList) do
local creatData = {
StageId = self.StageId,
Index = index,
CardId = data.CardId,
IsFinish = data.IsFinish,
}
tableInsert(datas, creatData)
end
self:RefreshLayout(self.StageEntity:GetRowAndColumnCount())
self:CreateTemplates(datas)
elseif stageStatus == XInvertCardGameConfig.InvertCardGameStageStatusType.Finish then
self:RefreshGamePanelWithFinish()
end
self:RefreshMessagePanel()
end
end
function XUiInvertGamePanel:RefreshGamePanelWithFinish(isBack)
if self.StageEntity then
local containCards = self.StageEntity:GetContainCards()
local datas = {}
for index, cardId in ipairs(containCards) do
local creatData = {
StageId = self.StageId,
Index = index,
CardId = cardId,
IsFinish = true,
IsBack = isBack,
}
tableInsert(datas, creatData)
end
self:RefreshLayout(self.StageEntity:GetRowAndColumnCount())
self:CreateTemplates(datas)
end
end
function XUiInvertGamePanel:RefreshMessagePanel()
local stageStatus = self.StageEntity:GetStatus()
local startState = XDataCenter.InvertCardGameManager.GetStartStage(self.StageEntity)
if startState == XInvertCardGameConfig.InvertCardGameStartStage.NotStart then
self.PanelMessage.gameObject:SetActiveEx(false)
return
end
if stageStatus == XInvertCardGameConfig.InvertCardGameStageStatusType.Lock or stageStatus == XInvertCardGameConfig.InvertCardGameStageStatusType.Finish then
self.PanelMessage.gameObject:SetActiveEx(false)
elseif stageStatus == XInvertCardGameConfig.InvertCardGameStageStatusType.Process then
self.PanelMessage.gameObject:SetActiveEx(true)
if self.StageEntity:GetTotalCounts() < self.StageEntity:GetMaxCostNum() then
self.TxtCount01.text = CSTextManagerGetText("InvertCardGameMaxInvertConutTextBlue", self.StageEntity:GetMaxCostNum(), self.StageEntity:GetTotalCounts(), self.StageEntity:GetMaxCostNum())
if XDataCenter.InvertCardGameManager.CheckHasEnoughItem(self.StageEntity) then
self.TxtSpend.text = CSTextManagerGetText("InvertCardGameConstomCountBlue", self.StageEntity:GetCostCoinNum())
else
self.TxtSpend.text = CSTextManagerGetText("InvertCardGameConstomCountRed", self.StageEntity:GetCostCoinNum())
end
else
local maxCostNum = self.StageEntity:GetMaxCostNum()
self.TxtCount01.text = CSTextManagerGetText("InvertCardGameMaxInvertConutTextNormal", maxCostNum, maxCostNum, maxCostNum)
self.TxtSpend.text = CSTextManagerGetText("InvertCardGameConstomCountBlue", 0)
end
self.TxtCount02.text = CSTextManagerGetText("InvertCardGameCurInvertConutText", #self.StageEntity:GetInvertList(), self.StageEntity:GetMaxOnCardsNum())
self.RImgIcon:SetRawImage(XDataCenter.ItemManager.GetItem(XDataCenter.InvertCardGameManager.GetConsumeItemId()).Template.Icon)
end
end
function XUiInvertGamePanel:RefreshLayout(rowCount, columnCount)
local spacingRow = (self.GamePanelWidth - columnCount * self.CardWidth) / (columnCount + 1) + self.CardWidth
local spacingColumn = (self.GamePanelHeight - rowCount * self.CardHeight) / (rowCount + 1) + self.CardHeight
if spacingRow < self.CardWidth or spacingColumn < self.CardHeight then
XLog.Error("Invert Card Game Refresh Layout Error")
return
end
self.LayoutGroup.spacing = Vector2(spacingRow, spacingColumn)
self.LayoutGroup.constraintCount = columnCount
end
function XUiInvertGamePanel:CreateTemplates(datas)
self.CardItems = {}
local onCreat = function(cardItem, data)
cardItem:SetActiveEx(true)
cardItem:OnCreat(data, self)
tableInsert(self.CardItems, cardItem)
end
XUiHelper.CreateTemplates(self.RootUi, self.CardPool, datas, XUiInvertGameCardItem.New, self.GridDrawRoot,
self.LayoutGroup.transform, onCreat)
end
function XUiInvertGamePanel:PlayAllTurnOnAnimation(cb)
for index, cardItem in ipairs(self.CardItems) do
if index == #self.CardItems then
cardItem:DORotate(function()
cardItem:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Front)
end, function()
if cb then
cb()
end
end)
else
cardItem:DORotate(function()
cardItem:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Front)
end)
end
end
end
function XUiInvertGamePanel:PlayAllTurnOffAnimation(cb)
for index, cardItem in ipairs(self.CardItems) do
if index == #self.CardItems then
cardItem:DORotate(function()
cardItem:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Back)
end, function()
if cb then
cb()
end
end)
else
cardItem:DORotate(function()
cardItem:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Back)
end)
end
end
end
function XUiInvertGamePanel:PlayCardGatherAnimation(cb)
for index, cardItem in ipairs(self.CardItems) do
if index == #self.CardItems then
cardItem:DOMoveToCenter(function()
if cb then
cb()
end
end)
else
cardItem:DOMoveToCenter()
end
end
end
function XUiInvertGamePanel:PlayCardDisperseAnimation(cb)
for index, cardItem in ipairs(self.CardItems) do
if index == #self.CardItems then
cardItem:DOMoveFromCenter(function()
if cb then
cb()
end
end)
else
cardItem:DOMoveFromCenter()
end
end
end
function XUiInvertGamePanel:PlayUpsetCardAnimation(cb)
self.RootUi:PlayAnimation("Refresh", cb)
end
function XUiInvertGamePanel:PlayStartAnimation()
local AsynPlayAllTurnOnAnimation = asynTask(self.PlayAllTurnOnAnimation, self)
local AsynPlayAllTurnOffAnimation = asynTask(self.PlayAllTurnOffAnimation, self)
local AsynPlayCardGatherAnimation = asynTask(self.PlayCardGatherAnimation, self)
local AsynPlayCardDisperseAnimation = asynTask(self.PlayCardDisperseAnimation, self)
local AsynPlayUpsetCardAnimation = asynTask(self.PlayUpsetCardAnimation, self)
RunAsyn(function()
AsynPlayAllTurnOnAnimation() -- 播放转到正面动画
asynWaitSecond(1) -- 延迟1秒
AsynPlayAllTurnOffAnimation() -- 播放转回背面动画
self:SetLayoutGroupEnableEx(false) -- 关闭布局
asynWaitSecond(1) -- 延迟1秒
AsynPlayCardGatherAnimation() -- 播放集中卡牌动画
self.GameObject:SetActiveEx(false)
-- 播放异步洗牌动画
AsynPlayUpsetCardAnimation() -- 洗牌动画
self.GameObject:SetActiveEx(true) -- 打开游戏面板
-- asynWaitSecond(0.1)
AsynPlayCardDisperseAnimation() -- 播放分散动画
self:SetLayoutGroupEnableEx(true) -- 打开布局
self:Refresh(self.StageEntity) -- 重新用服务器生成的随机卡牌刷新
self.RootUi:SetFullCoverActiveEx(false) -- 关闭全局遮罩
end)
end
function XUiInvertGamePanel:PlayCardsChangedAnimation(stageEntity, invertCardIdx, punishCardIdxs, clearCardIdxs)
local AsynPlayTurnOnAnimation = asynTask(self.PlayTurnOnAnimation, self)
local AsynPlayPunishAnimation = asynTask(self.PlayPunishAnimation, self)
local AsynPlayClearCardAnimation = asynTask(self.PlayClearCardAnimation, self)
local AsynPlayFinishStageAnimation = asynTask(self.PlayFinishStageAnimation, self)
RunAsyn(function()
self.RootUi:SetFullCoverActiveEx(true) -- 打开全局遮罩
AsynPlayTurnOnAnimation(invertCardIdx)
if punishCardIdxs and next(punishCardIdxs) then
AsynPlayPunishAnimation(punishCardIdxs)
end
if clearCardIdxs and next(clearCardIdxs) then
AsynPlayClearCardAnimation(clearCardIdxs)
end
--self:PlayClearCardAnimation(clearCardIdxs)
if stageEntity:GetStatus() == XInvertCardGameConfig.InvertCardGameStageStatusType.Finish then
self:RefreshGamePanelWithFinish(true)
AsynPlayFinishStageAnimation()
end
self:RefreshMessagePanel()
self.RootUi:RefreshBtnTab()
self.RootUi.RewardPanel:Refresh(stageEntity)
self.RootUi:SetFullCoverActiveEx(false) -- 关闭全局遮罩
end)
end
function XUiInvertGamePanel:PlayTurnOnAnimation(cardIndex, cb)
if cardIndex and cardIndex ~= 0 and self.CardItems[cardIndex] then
self.CardItems[cardIndex]:DORotate(function()
self.CardItems[cardIndex]:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Front)
end, function()
if cb then
cb()
end
end)
else
if cb then
cb()
end
end
end
function XUiInvertGamePanel:PlayPunishAnimation(cardIdxs, cb)
for index, cardIndex in ipairs(cardIdxs) do
if index == #cardIdxs then
self.CardItems[cardIndex]:DORotate(function()
self.CardItems[cardIndex]:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Back)
end, function()
if cb then
cb()
end
end)
else
self.CardItems[cardIndex]:DORotate(function()
self.CardItems[cardIndex]:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Back)
end)
end
end
end
function XUiInvertGamePanel:PlayClearCardAnimation(cardIdxs, cb)
for index, cardIndex in ipairs(cardIdxs) do
if index == #cardIdxs then
self.CardItems[cardIndex]:PlayClearEffectAnimation(function()
self.CardItems[cardIndex]:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Finish)
if cb then
cb()
end
end)
else
self.CardItems[cardIndex]:PlayClearEffectAnimation(function()
self.CardItems[cardIndex]:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Finish)
end)
end
end
end
function XUiInvertGamePanel:PlayFinishStageAnimation(cb)
for index, cardItem in ipairs(self.CardItems) do
if index == #self.CardItems then
cardItem:DORotate(function()
cardItem:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Front)
end, function()
if cb then
cb()
end
end)
else
cardItem:DORotate(function()
cardItem:SetCardState(XInvertCardGameConfig.InvertCardGameCardState.Front)
end)
end
end
end
function XUiInvertGamePanel:SetLayoutGroupEnableEx(bool)
self.LayoutGroup.enabled = bool
end
return XUiInvertGamePanel