优化项目架构
This commit is contained in:
203
SproutFarm-Frontend/GUI/GameSettingPanel.gd
Normal file
203
SproutFarm-Frontend/GUI/GameSettingPanel.gd
Normal file
@@ -0,0 +1,203 @@
|
||||
extends Panel
|
||||
#游戏设置面板
|
||||
|
||||
# UI组件引用
|
||||
@onready var background_music_h_slider: HSlider = $Scroll/Panel/BackgroundMusicHSlider
|
||||
@onready var weather_system_check: CheckButton = $Scroll/Panel/WeatherSystemCheck
|
||||
@onready var quit_button: Button = $QuitButton
|
||||
@onready var sure_button: Button = $SureButton
|
||||
@onready var refresh_button: Button = $RefreshButton
|
||||
|
||||
# 引用主游戏和其他组件
|
||||
@onready var main_game = get_node("/root/main")
|
||||
@onready var tcp_network_manager_panel: Panel = get_node("/root/main/UI/BigPanel/TCPNetworkManagerPanel")
|
||||
|
||||
# 游戏设置数据
|
||||
var game_settings: Dictionary = {
|
||||
"背景音乐音量": 1.0,
|
||||
"天气显示": true
|
||||
}
|
||||
|
||||
# 临时设置数据(用户修改但未确认的设置)
|
||||
var temp_settings: Dictionary = {}
|
||||
|
||||
func _ready() -> void:
|
||||
self.hide()
|
||||
|
||||
# 连接信号
|
||||
quit_button.pressed.connect(_on_quit_button_pressed)
|
||||
sure_button.pressed.connect(_on_sure_button_pressed)
|
||||
refresh_button.pressed.connect(_on_refresh_button_pressed)
|
||||
|
||||
# 设置音量滑块范围为0-1
|
||||
background_music_h_slider.min_value = 0.0
|
||||
background_music_h_slider.max_value = 1.0
|
||||
background_music_h_slider.step = 0.01
|
||||
background_music_h_slider.value_changed.connect(_on_background_music_h_slider_value_changed)
|
||||
weather_system_check.toggled.connect(_on_weather_system_check_toggled)
|
||||
|
||||
# 初始化设置值
|
||||
_load_settings_from_global()
|
||||
|
||||
# 当面板可见性改变时
|
||||
visibility_changed.connect(_on_visibility_changed)
|
||||
|
||||
func _on_visibility_changed():
|
||||
"""面板可见性改变时的处理"""
|
||||
if visible:
|
||||
# 面板显示时,刷新设置值
|
||||
_load_settings_from_global()
|
||||
_update_ui_from_settings()
|
||||
|
||||
# 禁用缩放功能
|
||||
GlobalVariables.isZoomDisabled = true
|
||||
else:
|
||||
# 面板隐藏时,恢复缩放功能
|
||||
GlobalVariables.isZoomDisabled = false
|
||||
|
||||
func _load_settings_from_global():
|
||||
"""从全局变量和玩家数据加载设置"""
|
||||
# 从GlobalVariables加载默认设置
|
||||
game_settings["背景音乐音量"] = GlobalVariables.BackgroundMusicVolume
|
||||
game_settings["天气显示"] = not GlobalVariables.DisableWeatherDisplay
|
||||
|
||||
# 如果主游戏已登录,尝试从玩家数据加载设置
|
||||
if main_game and main_game.login_data and main_game.login_data.has("游戏设置"):
|
||||
var player_settings = main_game.login_data["游戏设置"]
|
||||
if player_settings.has("背景音乐音量"):
|
||||
game_settings["背景音乐音量"] = player_settings["背景音乐音量"]
|
||||
if player_settings.has("天气显示"):
|
||||
game_settings["天气显示"] = player_settings["天气显示"]
|
||||
|
||||
# 初始化临时设置
|
||||
temp_settings = game_settings.duplicate()
|
||||
|
||||
func _update_ui_from_settings():
|
||||
"""根据设置数据更新UI"""
|
||||
# 更新音量滑块
|
||||
background_music_h_slider.value = temp_settings["背景音乐音量"]
|
||||
|
||||
# 更新天气显示复选框(注意:复选框表示"关闭天气显示")
|
||||
weather_system_check.button_pressed = not temp_settings["天气显示"]
|
||||
|
||||
func _apply_settings_immediately():
|
||||
"""立即应用设置(不保存到服务端)"""
|
||||
# 应用背景音乐音量设置
|
||||
_apply_music_volume_setting()
|
||||
|
||||
# 应用天气显示设置
|
||||
_apply_weather_display_setting()
|
||||
|
||||
func _save_settings_to_server():
|
||||
"""保存设置到服务端"""
|
||||
# 更新正式设置
|
||||
game_settings = temp_settings.duplicate()
|
||||
|
||||
# 应用设置
|
||||
_apply_settings_immediately()
|
||||
|
||||
# 如果已登录,保存到玩家数据并同步到服务端
|
||||
if main_game and main_game.login_data:
|
||||
main_game.login_data["游戏设置"] = game_settings.duplicate()
|
||||
|
||||
# 发送设置到服务端保存
|
||||
if tcp_network_manager_panel and tcp_network_manager_panel.has_method("is_connected_to_server") and tcp_network_manager_panel.is_connected_to_server():
|
||||
_send_settings_to_server()
|
||||
|
||||
func _apply_music_volume_setting():
|
||||
"""应用背景音乐音量设置"""
|
||||
var bgm_player = main_game.get_node_or_null("GameBGMPlayer")
|
||||
if bgm_player and bgm_player.has_method("set_volume"):
|
||||
bgm_player.set_volume(temp_settings["背景音乐音量"])
|
||||
|
||||
func _apply_weather_display_setting():
|
||||
"""应用天气显示设置"""
|
||||
var weather_system = main_game.get_node_or_null("WeatherSystem")
|
||||
if weather_system and weather_system.has_method("set_weather_display_enabled"):
|
||||
weather_system.set_weather_display_enabled(temp_settings["天气显示"])
|
||||
|
||||
func _send_settings_to_server():
|
||||
"""发送设置到服务端保存"""
|
||||
if tcp_network_manager_panel and tcp_network_manager_panel.has_method("send_message"):
|
||||
var message = {
|
||||
"type": "save_game_settings",
|
||||
"settings": game_settings,
|
||||
"timestamp": Time.get_unix_time_from_system()
|
||||
}
|
||||
|
||||
if tcp_network_manager_panel.send_message(message):
|
||||
print("游戏设置已发送到服务端保存")
|
||||
else:
|
||||
print("发送游戏设置到服务端失败")
|
||||
|
||||
func _on_quit_button_pressed() -> void:
|
||||
"""关闭设置面板"""
|
||||
self.hide()
|
||||
|
||||
func _on_background_music_h_slider_value_changed(value: float) -> void:
|
||||
"""背景音乐音量滑块值改变"""
|
||||
temp_settings["背景音乐音量"] = value
|
||||
# 立即应用音量设置(不保存到服务端)
|
||||
_apply_music_volume_setting()
|
||||
|
||||
# 显示当前音量百分比
|
||||
var volume_percent = int(value * 100)
|
||||
|
||||
func _on_weather_system_check_toggled(toggled_on: bool) -> void:
|
||||
"""天气系统复选框切换"""
|
||||
# 复选框表示"关闭天气显示",所以需要取反
|
||||
temp_settings["天气显示"] = not toggled_on
|
||||
# 立即应用天气设置(不保存到服务端)
|
||||
_apply_weather_display_setting()
|
||||
|
||||
# 显示提示
|
||||
var status_text = "已开启" if temp_settings["天气显示"] else "已关闭"
|
||||
Toast.show("天气显示" + status_text, Color.YELLOW)
|
||||
|
||||
#确认修改设置按钮,点击这个才会发送数据到服务端
|
||||
func _on_sure_button_pressed() -> void:
|
||||
"""确认修改设置"""
|
||||
_save_settings_to_server()
|
||||
Toast.show("设置已保存!", Color.GREEN)
|
||||
|
||||
#刷新设置面板,从服务端加载游戏设置数据
|
||||
func _on_refresh_button_pressed() -> void:
|
||||
"""刷新设置"""
|
||||
_load_settings_from_global()
|
||||
_update_ui_from_settings()
|
||||
_apply_settings_immediately()
|
||||
Toast.show("设置已刷新!", Color.CYAN)
|
||||
|
||||
# 移除原来的自动保存方法,避免循环调用
|
||||
func _on_background_music_h_slider_drag_ended(value_changed: bool) -> void:
|
||||
"""背景音乐音量滑块拖拽结束(保留以兼容场景连接)"""
|
||||
# 不再自动保存,只显示提示
|
||||
if value_changed:
|
||||
var volume_percent = int(background_music_h_slider.value * 100)
|
||||
|
||||
# 公共方法,供外部调用
|
||||
func refresh_settings():
|
||||
"""刷新设置(从服务端或本地重新加载)"""
|
||||
_load_settings_from_global()
|
||||
_update_ui_from_settings()
|
||||
_apply_settings_immediately()
|
||||
|
||||
func get_current_settings() -> Dictionary:
|
||||
"""获取当前设置"""
|
||||
return game_settings.duplicate()
|
||||
|
||||
func apply_settings_from_server(server_settings: Dictionary):
|
||||
"""应用从服务端接收到的设置(避免循环调用)"""
|
||||
if server_settings.has("背景音乐音量"):
|
||||
game_settings["背景音乐音量"] = server_settings["背景音乐音量"]
|
||||
temp_settings["背景音乐音量"] = server_settings["背景音乐音量"]
|
||||
if server_settings.has("天气显示"):
|
||||
game_settings["天气显示"] = server_settings["天气显示"]
|
||||
temp_settings["天气显示"] = server_settings["天气显示"]
|
||||
|
||||
# 只更新UI,不再触发保存
|
||||
if visible:
|
||||
_update_ui_from_settings()
|
||||
_apply_settings_immediately()
|
||||
|
||||
print("已应用来自服务端的游戏设置")
|
||||
Reference in New Issue
Block a user