UGCProjects/GZJ/Script/UI/WBP_SelectDifficultyPanel.lua
2025-01-08 22:46:12 +08:00

193 lines
6.8 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.

---@class WBP_SelectDifficultyPanel_C:UUserWidget
---@field CanvasPanel_Area UCanvasPanel
---@field CanvasPanel_Main UCanvasPanel
---@field HorizontalBox_RemainTime UHorizontalBox
---@field ScrollBox_Range UScrollBox
---@field TextBlock_RemainTime UTextBlock
---@field TextBlock_SelectDifficultyTip UTextBlock
---@field TextBlock_Total UTextBlock
---@field UniformGridPanel_Items UUniformGridPanel
---@field WBP_WidgetHeader UWBP_WidgetHeader_C
--Edit Below--
local WBP_SelectDifficultyPanel = {
bInitDoOnce = false;
GridItemWidgetClass = nil; -- 难度项的类
RangeItemClass = nil; -- Range 项的类
MaxDifficulty = 0; -- 最高难度
SelectDifficulty = 0; -- 是否选择过难度
TotalRangeNum = 0; -- 当前 Range Item 个数
RecommendLevel = 0; -- 推荐等级
CurrentRangeNum = 0;
HadShow = false; -- 是否显示过
};
function WBP_SelectDifficultyPanel:Construct()
WBP_SelectDifficultyPanel.SuperClass.Construct(self)
self.WBP_WidgetHeader.UIType = EUIType.SelectDifficulty
self.WBP_WidgetHeader.bIsCloseUITypeUI = false;
self.WBP_WidgetHeader.CloseUIFunc = function()
UIManager:GetPanel(EUIType.SelectDifficulty):CloseOtherWidget()
end
self.WBP_WidgetHeader:Construct()
self.ScrollBox_Range:ClearChildren()
self.GridItemWidgetClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_DifficultyItem.WBP_DifficultyItem_C'))
self.RangeItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_DifficultyRangeItem.WBP_DifficultyRangeItem_C'))
self:SetMaxDifficulty(66);
self.TextBlock_Total:SetText(string.format(""))
EventSystem:AddListener(EventType.PlayerDifficultySelectionChanged, self.OnPlayerDifficultySelectionChange, self)
EventSystem:AddListener(EventType.OnGameReadyStageRemainTimeChanged, self.OnGameReadyStageRemainTimeChange, self)
--self.UniformGridPanel_Items:ClearChildren()
--for i = 1, 10 do
-- local Widget = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.GridItemWidgetClass)
-- local Slot = self.UniformGridPanel_Items:AddChildToUniformGrid(Widget)
-- Slot:SetColumn(0)
-- Slot:SetRow(i - 1)
--end
end
function WBP_SelectDifficultyPanel:OnShowPanel(...)
self.HadShow = true;
end
-- 关闭除了倒计时的其他页面
function WBP_SelectDifficultyPanel:CloseOtherWidget()
self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed);
self.TextBlock_SelectDifficultyTip:SetVisibility(ESlateVisibility.Collapsed)
end
-- function WBP_SelectDifficultyPanel:Tick(MyGeometry, InDeltaTime)
-- end
function WBP_SelectDifficultyPanel:Destruct()
EventSystem:RemoveListener(EventType.PlayerDifficultySelectionChanged, WBP_SelectDifficultyPanel.OnPlayerDifficultySelectionChange, self)
EventSystem:RemoveListener(EventType.OnGameReadyStageRemainTimeChanged, WBP_SelectDifficultyPanel.OnGameReadyStageRemainTimeChange, self)
end
function WBP_SelectDifficultyPanel:OnGameReadyStageRemainTimeChange(RemainTime)
if RemainTime <= 0 then
self.HorizontalBox_RemainTime:SetVisibility(ESlateVisibility.Collapsed)
else
self.HorizontalBox_RemainTime:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
self.TextBlock_RemainTime:SetText(tostring(RemainTime))
end
end
function WBP_SelectDifficultyPanel:SetMaxDifficulty(InNum)
self.TotalRangeNum = (InNum + 9) // 10
self.MaxDifficulty = InNum
for i = 1, self.TotalRangeNum do
if UE.IsValid(self.RangeItemClass) and UE.IsValid(UGCGameSystem.GameState) then
local RangeItem = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.RangeItemClass)
self.ScrollBox_Range:AddChild(RangeItem)
RangeItem:SetRangeNum(i, self.MaxDifficulty)
RangeItem:SetIsClick(false)
end
end
self:GetRecommendLevel()
end
function WBP_SelectDifficultyPanel:GetRecommendLevel()
-- 获取存档数据,然后检查之前玩过的局数,可解锁的局数 = 通关过的局数 + 1
local PS = GameDataManager.GetLocalPlayerState()
if table.getCount(PS.ArchiveData.PlayedGames) > 0 then
-- i: 难度v: 局数
local MaxDiff = 0
for i, v in pairs(PS.ArchiveData.PlayedGames) do
if i > MaxDiff and v > 0 then
MaxDiff = i
end
end
self.RecommendLevel = MaxDiff + 1
else
self.RecommendLevel = 1
end
-- 设置 Range Num过去
self:SetRangeNum((self.RecommendLevel + 9) // 10)
end
function WBP_SelectDifficultyPanel:SetRangeNum(InNum)
print(string.format('[WBP_SelectDifficultyPanel:SetRangeNum] Num = %d', InNum))
if self.CurrentRangeNum == InNum then
return
end
self.CurrentRangeNum = InNum
if InNum == self.TotalRangeNum then
for i = 1, 10 - self.MaxDifficulty % 10 do
self.UniformGridPanel_Items:GetChildAt(10 - i):SetVisibility(ESlateVisibility.Hidden)
end
else
for i = 1, 10 do
self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisibility(ESlateVisibility.SelfHitTestInvisible)
end
end
for i = 1, 10 do
if self.UniformGridPanel_Items:GetChildAt(i - 1):GetVisibility() == ESlateVisibility.SelfHitTestInvisible then
local Difficult = (InNum - 1) * 10 + i
self.UniformGridPanel_Items:GetChildAt(i - 1):SetDifficulty(Difficult)
end
end
-- 显示状态
-- 判断最小的是否大于值
if (InNum - 1) * 10 + 1 > self.RecommendLevel then
for i = 1, 10 do
self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(0)
end
elseif InNum * 10 < self.RecommendLevel then -- 判断最大的是否小于值
for i = 1, 10 do
self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(1)
end
else --就是在中间
for i = 1, 10 do
local Val = self.UniformGridPanel_Items:GetChildAt(i - 1).Difficulty
if Val <= self.RecommendLevel then
self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(1)
else
self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(0)
end
end
end
-- 找到自己选择的 难度
if self.SelectDifficulty ~= 0 then
if (InNum - 1) * 10 + 1 <= self.SelectDifficulty and self.SelectDifficulty <= InNum * 10 then
for i = 1, 10 do
if self.UniformGridPanel_Items:GetChildAt(i - 1).Difficulty == self.SelectDifficulty then
self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(2)
break
end
end
end
end
end
function WBP_SelectDifficultyPanel:SetCurrentDifficulty(InNum)
print(string.format('[WBP_SelectDifficultyPanel:SetCurrentDifficulty] 选择的难度 = %d', InNum))
self.SelectDifficulty = InNum
-- 设置当前的选项
local PC = GameDataManager.GetLocalPlayerController()
UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_SelectGameDifficulty", InNum)
end
function WBP_SelectDifficultyPanel:OnPlayerDifficultySelectionChange(InData)
-- 直接显示在最上面的文本框中
if table.getCount(InData) == 0 then
return
end
-- i难度v票数
local ToText = ''
for i, v in pairs(InData) do
ToText = ToText .. '难度'..tostring(i)..': '.. tostring(v) .. '\t'
end
self.TextBlock_Total:SetText(ToText)
end
return WBP_SelectDifficultyPanel;