完成部分服务器数据向MongoDB数据库迁移
This commit is contained in:
@@ -1,9 +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()
|
||||
pass
|
||||
|
||||
# 连接信号
|
||||
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()
|
||||
pass
|
||||
|
||||
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("已应用来自服务端的游戏设置")
|
||||
|
||||
@@ -23,8 +23,10 @@ corner_radius_bottom_left = 10
|
||||
corner_detail = 20
|
||||
|
||||
[node name="GameSettingPanel" type="Panel"]
|
||||
offset_right = 1398.0
|
||||
offset_bottom = 720.0
|
||||
offset_left = 151.0
|
||||
offset_top = 74.0
|
||||
offset_right = 1549.0
|
||||
offset_bottom = 794.0
|
||||
scale = Vector2(0.8, 0.8)
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_0c52c")
|
||||
script = ExtResource("1_0c52c")
|
||||
@@ -78,18 +80,84 @@ layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Label" type="Label" parent="Scroll/Panel"]
|
||||
[node name="BackgroundMusicLabel" type="Label" parent="Scroll/Panel"]
|
||||
layout_mode = 2
|
||||
offset_right = 210.0
|
||||
offset_bottom = 42.0
|
||||
theme_override_font_sizes/font_size = 30
|
||||
offset_left = -1.52588e-05
|
||||
offset_right = 245.0
|
||||
offset_bottom = 49.0
|
||||
theme_override_font_sizes/font_size = 35
|
||||
text = "背景音乐音量:"
|
||||
|
||||
[node name="HSlider" type="HSlider" parent="Scroll/Panel"]
|
||||
layout_mode = 0
|
||||
offset_left = 210.0
|
||||
offset_top = 15.0
|
||||
offset_right = 573.0
|
||||
offset_bottom = 31.0
|
||||
[node name="BackgroundMusicHSlider" type="HSlider" parent="Scroll/Panel"]
|
||||
layout_mode = 2
|
||||
offset_left = 245.0
|
||||
offset_right = 574.0
|
||||
offset_bottom = 49.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 1
|
||||
|
||||
[connection signal="pressed" from="QuitButton" to="." method="_on_quit_button_pressed"]
|
||||
[node name="WeatherSystemLabel" type="Label" parent="Scroll/Panel"]
|
||||
layout_mode = 2
|
||||
offset_left = -0.249969
|
||||
offset_top = 48.75
|
||||
offset_right = 209.75
|
||||
offset_bottom = 97.75
|
||||
theme_override_font_sizes/font_size = 35
|
||||
text = "关闭天气显示:"
|
||||
|
||||
[node name="WeatherSystemCheck" type="CheckButton" parent="Scroll/Panel"]
|
||||
layout_mode = 2
|
||||
offset_left = 244.75
|
||||
offset_top = 48.75
|
||||
offset_right = 288.75
|
||||
offset_bottom = 72.75
|
||||
scale = Vector2(2, 2)
|
||||
theme_override_font_sizes/font_size = 100
|
||||
|
||||
[node name="HBox" type="HBoxContainer" parent="Scroll/Panel"]
|
||||
visible = false
|
||||
layout_mode = 0
|
||||
offset_top = 97.0
|
||||
offset_right = 853.0
|
||||
offset_bottom = 154.0
|
||||
|
||||
[node name="ChangeServer" type="Label" parent="Scroll/Panel/HBox"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 35
|
||||
text = "切换服务器"
|
||||
|
||||
[node name="IPInput" type="LineEdit" parent="Scroll/Panel/HBox"]
|
||||
custom_minimum_size = Vector2(400, 0)
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 35
|
||||
placeholder_text = "请输入服务器IP地址"
|
||||
|
||||
[node name="PortInput" type="LineEdit" parent="Scroll/Panel/HBox"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 35
|
||||
placeholder_text = "端口"
|
||||
alignment = 1
|
||||
|
||||
[node name="ChangeButton" type="Button" parent="Scroll/Panel/HBox"]
|
||||
custom_minimum_size = Vector2(120, 0)
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 35
|
||||
text = "切换"
|
||||
|
||||
[node name="SureButton" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 647.5
|
||||
offset_top = 635.0
|
||||
offset_right = 815.5
|
||||
offset_bottom = 698.0
|
||||
theme_override_font_sizes/font_size = 40
|
||||
text = "确认修改"
|
||||
|
||||
[node name="RefreshButton" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 27.5001
|
||||
offset_top = 25.0001
|
||||
offset_right = 195.5
|
||||
offset_bottom = 88.0001
|
||||
theme_override_font_sizes/font_size = 40
|
||||
text = "刷新"
|
||||
|
||||
@@ -2,7 +2,7 @@ extends Control
|
||||
#各种面板
|
||||
@onready var game_about_panel: Panel = $GameAboutPanel
|
||||
@onready var game_update_panel: Panel = $GameUpdatePanel
|
||||
@onready var game_setting_panel: Panel = $GameSettingPanel
|
||||
#@onready var game_setting_panel: Panel = $GameSettingPanel
|
||||
|
||||
@onready var game_version_label: Label = $GUI/GameVersionLabel
|
||||
|
||||
@@ -23,7 +23,7 @@ func _on_start_game_button_pressed() -> void:
|
||||
|
||||
#游戏设置
|
||||
func _on_game_setting_button_pressed() -> void:
|
||||
game_setting_panel.show()
|
||||
#game_setting_panel.show()
|
||||
pass
|
||||
|
||||
#游戏更新
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=12 format=3 uid="uid://bypjb28h4ntdr"]
|
||||
[gd_scene load_steps=11 format=3 uid="uid://bypjb28h4ntdr"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://badqjgdfhg7vt" path="res://GUI/MainMenuPanel.gd" id="1_wpehy"]
|
||||
[ext_resource type="Texture2D" uid="uid://ddcmrh50o1y0q" path="res://assets/菜单UI/背景1.webp" id="2_eghpk"]
|
||||
@@ -7,7 +7,6 @@
|
||||
[ext_resource type="Texture2D" uid="uid://dgdootc5bny5q" path="res://assets/菜单UI/QQ群.webp" id="4_eghpk"]
|
||||
[ext_resource type="Script" uid="uid://kj7v1uxk2i6h" path="res://GUI/GameUpdatePanel.gd" id="4_fys16"]
|
||||
[ext_resource type="Texture2D" uid="uid://ccav04woielxa" path="res://assets/菜单UI/柚小青装饰品.webp" id="5_6jmhb"]
|
||||
[ext_resource type="PackedScene" uid="uid://dos15dmc1b6bt" path="res://GUI/GameSettingPanel.tscn" id="6_eghpk"]
|
||||
[ext_resource type="Script" uid="uid://ciwjx67wjubdy" path="res://GUI/CheckUpdatePanel.gd" id="9_6jmhb"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_eghpk"]
|
||||
@@ -129,6 +128,7 @@ theme_override_font_sizes/font_size = 40
|
||||
text = "开始游戏"
|
||||
|
||||
[node name="GameSettingButton" type="Button" parent="VBox"]
|
||||
visible = false
|
||||
custom_minimum_size = Vector2(168, 63)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
@@ -140,7 +140,7 @@ custom_minimum_size = Vector2(168, 63)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
theme_override_font_sizes/font_size = 40
|
||||
text = "游戏更新"
|
||||
text = "更新"
|
||||
|
||||
[node name="GameAboutButton" type="Button" parent="VBox"]
|
||||
custom_minimum_size = Vector2(168, 63)
|
||||
@@ -156,14 +156,6 @@ size_flags_horizontal = 4
|
||||
theme_override_font_sizes/font_size = 40
|
||||
text = "退出游戏"
|
||||
|
||||
[node name="GameSettingPanel" parent="." instance=ExtResource("6_eghpk")]
|
||||
visible = false
|
||||
layout_mode = 0
|
||||
offset_left = 138.0
|
||||
offset_top = 80.0
|
||||
offset_right = 1536.0
|
||||
offset_bottom = 800.0
|
||||
|
||||
[node name="GameAboutPanel" type="Panel" parent="."]
|
||||
visible = false
|
||||
layout_mode = 0
|
||||
|
||||
Reference in New Issue
Block a user