193 lines
6.8 KiB
Lua
193 lines
6.8 KiB
Lua
---@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; |