Files
StellaSora_DataLua/lua/game/ui/settings/settingsgraphicctrl.lua
T
SL1900 5e0d58cfad Initial version - 1.2.0.60
EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
2025-12-03 01:00:00 +09:00

273 lines
11 KiB
Lua
Raw 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 SettingsGraphicCtrl = class("SettingsGraphicCtrl", BaseCtrl)
local ModuleManager = require("GameCore.Module.ModuleManager")
local GameRenderingSettingManager = CS.GameRenderingSettingManager
local UIGameSystemSetup = CS.UIGameSystemSetup
local GraphicQualityLevelEnum = {
GameRenderingSettingManager.QualityLevel.Low,
GameRenderingSettingManager.QualityLevel.Medium,
GameRenderingSettingManager.QualityLevel.High
}
local GraphicOptionIndex = {
ResolutionRatio = 1,
FrameRate = 2,
ShadingQuality = 3,
LightShadow = 4,
AntAliasing = 5
}
SettingsGraphicCtrl._mapNodeConfig = {
txtPageTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Settings_Display"
},
txtShadingQuality = {
sComponentName = "TMP_Text",
sLanguageId = "Settings_Display_ShadingQuality"
},
txtWindowResolution = {
sComponentName = "TMP_Text",
sLanguageId = "Settings_Display_WindowResolution"
},
btnWindowResolution = {
sComponentName = "UIButton",
callback = "OnBtnClick_WindowResolution"
},
imgResolutionGray = {},
txtResolutionValue = {nCount = 2, sComponentName = "TMP_Text"},
Screen = {
sCtrlName = "Game.UI.Settings.OptionUpdateChooseCtrl"
},
WindowResolution = {},
L2dSwitch = {
sCtrlName = "Game.UI.Settings.OptionSwitchCtrl"
},
VsyncSwitch = {
sCtrlName = "Game.UI.Settings.OptionSwitchCtrl"
},
ShadingQuality = {
sCtrlName = "Game.UI.Settings.OptionChooseCtrl"
},
ResolutionRatio = {
sCtrlName = "Game.UI.Settings.OptionChooseCtrl"
},
FrameRate = {
sCtrlName = "Game.UI.Settings.OptionChooseCtrl"
},
Shadow = {
sCtrlName = "Game.UI.Settings.OptionChooseCtrl"
},
AntAliasing = {
sCtrlName = "Game.UI.Settings.OptionChooseCtrl"
},
txtWidescreen = {
sComponentName = "TMP_Text",
sLanguageId = "Settings_Display_Widescreen"
},
txtBtnWidescreen = {
sComponentName = "TMP_Text",
sLanguageId = "Settings_Btn_Go"
},
btnWidescreen = {
sComponentName = "UIButton",
callback = "OnBtnClick_Widescreen"
}
}
SettingsGraphicCtrl._mapEventConfig = {
SettingsSetResolution = "OnEvent_SetResolution"
}
function SettingsGraphicCtrl:RefreshText()
if not NovaAPI.IsMobilePlatform() then
self._mapNode.Screen:SetText(ConfigTable.GetUIText("Settings_Display_Screen_Full"), ConfigTable.GetUIText("Settings_Display_Screen_Window"), nil, ConfigTable.GetUIText("Settings_Display_Screen"))
end
self._mapNode.L2dSwitch:SetText(ConfigTable.GetUIText("Settings_L2d"))
self._mapNode.ShadingQuality:SetText(ConfigTable.GetUIText("Settings_Display_ShadingQuality_Low"), ConfigTable.GetUIText("Settings_Display_ShadingQuality_Medium"), ConfigTable.GetUIText("Settings_Display_ShadingQuality_High"), ConfigTable.GetUIText("Settings_Display_ShadingQuality"))
if NovaAPI.IsMobilePlatform() then
self._mapNode.ResolutionRatio:SetText(ConfigTable.GetUIText("Settings_Display_ResolutionRatio_Low"), ConfigTable.GetUIText("Settings_Display_ResolutionRatio_Medium"), ConfigTable.GetUIText("Settings_Display_ResolutionRatio_High"), ConfigTable.GetUIText("Settings_Display_ResolutionRatio"))
end
self._mapNode.FrameRate:SetText(ConfigTable.GetUIText("Settings_Display_FrameRate_Low"), ConfigTable.GetUIText("Settings_Display_FrameRate_Medium"), ConfigTable.GetUIText("Settings_Display_FrameRate_High"), ConfigTable.GetUIText("Settings_Display_FrameRate"))
self._mapNode.Shadow:SetText(ConfigTable.GetUIText("Settings_Display_Shadow_Low"), ConfigTable.GetUIText("Settings_Display_Shadow_Medium"), ConfigTable.GetUIText("Settings_Display_Shadow_High"), ConfigTable.GetUIText("Settings_Display_Shadow"))
self._mapNode.AntAliasing:SetText(ConfigTable.GetUIText("Settings_Display_AntAliasing_Low"), ConfigTable.GetUIText("Settings_Display_AntAliasing_Medium"), ConfigTable.GetUIText("Settings_Display_AntAliasing_High"), ConfigTable.GetUIText("Settings_Display_AntAliasing"))
if not NovaAPI.IsMobilePlatform() then
self._mapNode.VsyncSwitch:SetText(ConfigTable.GetUIText("Settings_Vsync"))
end
end
function SettingsGraphicCtrl:Init()
if self.bInit then
return
end
self.bInit = true
self:LoadSetting()
end
function SettingsGraphicCtrl:Quit()
if not self.bInit then
return
end
end
function SettingsGraphicCtrl:LoadSetting()
self.optionLevelIndex = {}
if NovaAPI.IsMobilePlatform() then
self.optionLevelIndex[GraphicOptionIndex.ResolutionRatio] = 1
end
self.optionLevelIndex[GraphicOptionIndex.FrameRate] = 1
self.optionLevelIndex[GraphicOptionIndex.ShadingQuality] = 1
self.optionLevelIndex[GraphicOptionIndex.LightShadow] = 1
self.optionLevelIndex[GraphicOptionIndex.AntAliasing] = 1
for i = 1, #GraphicQualityLevelEnum do
if NovaAPI.IsMobilePlatform() and GameRenderingSettingManager.Instance.resolutionScaleQualityTier == GraphicQualityLevelEnum[i] then
self.optionLevelIndex[GraphicOptionIndex.ResolutionRatio] = i
self._mapNode.ResolutionRatio:Init(function(index)
GameRenderingSettingManager.Instance.resolutionScaleQualityTier = GraphicQualityLevelEnum[index]
self.optionLevelIndex[GraphicOptionIndex.ResolutionRatio] = index
EventManager.Hit(EventId.MarkFullRectWH)
end, i)
end
if GameRenderingSettingManager.Instance.frameRateQualityTier == GraphicQualityLevelEnum[i] then
self.optionLevelIndex[GraphicOptionIndex.FrameRate] = i
self._mapNode.FrameRate:Init(function(index)
GameRenderingSettingManager.Instance.frameRateQualityTier = GraphicQualityLevelEnum[index]
self.optionLevelIndex[GraphicOptionIndex.FrameRate] = index
end, i)
end
if GameRenderingSettingManager.Instance.shadingQualityTier == GraphicQualityLevelEnum[i] then
self.optionLevelIndex[GraphicOptionIndex.ShadingQuality] = i
self._mapNode.ShadingQuality:Init(function(index)
GameRenderingSettingManager.Instance.shadingQualityTier = GraphicQualityLevelEnum[index]
self.optionLevelIndex[GraphicOptionIndex.ShadingQuality] = index
end, i)
end
if GameRenderingSettingManager.Instance.lightShadowQualityTier == GraphicQualityLevelEnum[i] then
self.optionLevelIndex[GraphicOptionIndex.LightShadow] = i
self._mapNode.Shadow:Init(function(index)
GameRenderingSettingManager.Instance.lightShadowQualityTier = GraphicQualityLevelEnum[index]
self.optionLevelIndex[GraphicOptionIndex.LightShadow] = index
end, i)
end
if GameRenderingSettingManager.Instance.antialiasingQualityTier == GraphicQualityLevelEnum[i] then
self.optionLevelIndex[GraphicOptionIndex.AntAliasing] = i
self._mapNode.AntAliasing:Init(function(index)
GameRenderingSettingManager.Instance.antialiasingQualityTier = GraphicQualityLevelEnum[index]
self.optionLevelIndex[GraphicOptionIndex.AntAliasing] = index
end, i)
end
end
if not NovaAPI.IsMobilePlatform() then
self.nScreen = GameRenderingSettingManager.Instance:IsFullScreen() and 1 or 2
self:RefreshScreen()
self.timer = self:AddTimer(0, 0.034, function()
self.nScreen = GameRenderingSettingManager.Instance:IsFullScreen() and 1 or 2
if self.nBeforeScreen ~= self.nScreen then
self:ForceChange1080p(self.nBeforeScreen, self.nScreen)
self:RefreshScreen()
end
end, true, true, true)
self.nResolution = GameRenderingSettingManager.Instance:GetCurrentResolutionIndex() + 1
self:ChangeWindowResolution(self.nResolution)
end
self.bUseLive2D = self._panel:LoadLocalData("UseLive2D")
self._mapNode.L2dSwitch:Init(function()
self.bUseLive2D = not self.bUseLive2D
EventManager.Hit("SettingsChangeL2d", self.bUseLive2D)
self._panel:SaveLocalData("UseLive2D", self.bUseLive2D)
end, self.bUseLive2D)
if not NovaAPI.IsMobilePlatform() then
self.bVsync = GameRenderingSettingManager.Instance.vSyncEnabled
self._mapNode.VsyncSwitch:Init(function()
self.bVsync = not self.bVsync
GameRenderingSettingManager.Instance.vSyncEnabled = self.bVsync
end, self.bVsync)
end
end
function SettingsGraphicCtrl:SaveSetting()
GameRenderingSettingManager.Instance:SaveSetting()
end
function SettingsGraphicCtrl:ChangeWindowResolution(nIndex)
if nIndex then
for i = 1, 2 do
NovaAPI.SetTMPText(self._mapNode.txtResolutionValue[i], self.tbResolution[nIndex])
end
end
end
function SettingsGraphicCtrl:RefreshScreen()
self._mapNode.Screen:Init(function(index, callback)
GameRenderingSettingManager.Instance:SetScreenResolution(self.nResolution - 1, index == 1)
local nCur = GameRenderingSettingManager.Instance:IsFullScreen() and 1 or 2
if nCur == index then
callback()
self.nBeforeScreen = self.nScreen
self.nScreen = index
self:ForceChange1080p(self.nBeforeScreen, index)
end
end, self.nScreen, 2)
self.nBeforeScreen = self.nScreen
end
function SettingsGraphicCtrl:ForceChange1080p(nBefore, nAfter)
if nBefore == 1 and nAfter == 2 then
local nCount = #self.tbResolution
local nMax = 4 <= nCount and 4 or nCount
for i = 1, nMax do
if string.find(self.tbResolution[i], "1920") then
EventManager.Hit("SettingsSetResolution", i)
return
end
end
end
end
function SettingsGraphicCtrl:Awake()
self.bInit = false
local bMobile = NovaAPI.IsMobilePlatform()
self._mapNode.Screen.gameObject:SetActive(not bMobile)
self._mapNode.WindowResolution.gameObject:SetActive(not bMobile)
self._mapNode.ResolutionRatio.gameObject:SetActive(bMobile)
self._mapNode.VsyncSwitch.gameObject:SetActive(not bMobile)
if not bMobile then
local tbSupport = GameRenderingSettingManager.Instance:GetSupportScreenResolutions()
self.tbResolution = {}
for i = 0, tbSupport.Length - 1 do
table.insert(self.tbResolution, tbSupport[i].x .. "×" .. tbSupport[i].y)
end
end
self:RefreshText()
end
function SettingsGraphicCtrl:OnEnable()
end
function SettingsGraphicCtrl:OnDisable()
if not self.bInit then
return
end
self:SaveSetting()
if self.timer ~= nil then
self.timer:Cancel()
self.timer = nil
end
end
function SettingsGraphicCtrl:OnDestroy()
end
function SettingsGraphicCtrl:OnBtnClick_WindowResolution()
if next(self.tbResolution) == nil then
return
end
EventManager.Hit("SettingsResolution", self.nResolution, self.tbResolution)
end
function SettingsGraphicCtrl:OnEvent_SetResolution(nIndex)
self.nResolution = nIndex
GameRenderingSettingManager.Instance:SetScreenResolution(self.nResolution - 1, self.nScreen == 1)
self:ChangeWindowResolution(self.nResolution)
end
function SettingsGraphicCtrl:OnBtnClick_Widescreen()
if ModuleManager.GetIsAdventure() then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Settings_Widescreen_BattleUnable"))
elseif Settings.CURRENT_CANVAS_FULL_RECT_WIDTH / Settings.CURRENT_CANVAS_FULL_RECT_HEIGHT <= 2 then
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = ConfigTable.GetUIText("Settings_Widescreen_ScreenUnable"),
callbackConfirm = function()
EventManager.Hit(EventId.OpenPanel, PanelId.SettingsPreview)
end,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
else
EventManager.Hit(EventId.OpenPanel, PanelId.SettingsPreview)
end
end
return SettingsGraphicCtrl