Files
Sprout-Farm/SproutFarm-Frontend/GUI/GameSettingPanel.gd
2025-09-15 19:10:37 +08:00

204 lines
7.2 KiB
GDScript
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.
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("已应用来自服务端的游戏设置")