From ebe9faa46ccb69ed775762e9a3fddeadfa5fff24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Sun, 10 May 2026 06:43:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BF=9D=E5=AD=98=E7=B3=BB=E7=BB=9F):=20?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E4=BF=9D=E5=AD=98=E6=95=B0=E6=8D=AE=E7=9A=84?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E5=92=8C=E5=8F=8D=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构保存系统以使用新的嵌套字典工具方法 修改Starter场景中的按钮文本并隐藏多人游戏选项 添加JsonTool和ArrayTool的嵌套数据操作方法 --- .../Scenes/FullscreenPanels/Starter.tscn | 4 +-- scripts/Tools/ArrayTool.gd | 31 +++++++++++++++++++ scripts/Tools/Engines/SaveEngine.gd | 12 +++---- scripts/Tools/JsonTool.gd | 2 ++ 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/components/Scenes/FullscreenPanels/Starter.tscn b/components/Scenes/FullscreenPanels/Starter.tscn index 7593e11..0111497 100644 --- a/components/Scenes/FullscreenPanels/Starter.tscn +++ b/components/Scenes/FullscreenPanels/Starter.tscn @@ -320,8 +320,7 @@ unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 toggle_mode = true -button_pressed = true -text = "观看" +text = "跳过" [node name="start" type="VBoxContainer" parent="content/wrapper/layout/startGameWrapper/start/starter/singleplayer" index="1" unique_id=1119283819] layout_mode = 2 @@ -343,6 +342,7 @@ theme = ExtResource("4_lfxcn") text = "多人游戏" [node name="multiplayer" type="VBoxContainer" parent="content/wrapper/layout/startGameWrapper/start/starter" index="1" unique_id=2010516457] +visible = false layout_mode = 2 theme_override_constants/separation = 15 alignment = 1 diff --git a/scripts/Tools/ArrayTool.gd b/scripts/Tools/ArrayTool.gd index a093ac8..fb54ef3 100644 --- a/scripts/Tools/ArrayTool.gd +++ b/scripts/Tools/ArrayTool.gd @@ -53,3 +53,34 @@ static func mergeDictionary(a: Dictionary, b: Dictionary) -> Dictionary: for key in b: result[key] = result.get(key, 0.0) + b[key] return result +static func getNested(data: Variant, path: String) -> Variant: + var keys = path.split(".") + var result = data + for key in keys: + if result is Dictionary: + result = result[key] + elif result is Array: + result = result[key.to_int()] + else: + return null + return result +static func setNested(data: Variant, path: String, value: Variant): + var keys = path.split(".") + for i in range(keys.size() - 1): + var key = keys[i] + if data is Dictionary: + data = data[key] + elif data is Array: + data = data[key.to_int()] + else: + return + var lastKey = keys[-1] + if data is Dictionary: + data[lastKey] = value + elif data is Array: + var index = lastKey.to_int() + if index == data.size(): + data.append(value) + else: + data[index] = value + return data diff --git a/scripts/Tools/Engines/SaveEngine.gd b/scripts/Tools/Engines/SaveEngine.gd index 35412fe..c314392 100644 --- a/scripts/Tools/Engines/SaveEngine.gd +++ b/scripts/Tools/Engines/SaveEngine.gd @@ -3,7 +3,7 @@ class_name SaveEngine const SAVE_FILE = "user://save.json" static func serialize(): - return { + return JsonTool.stringify({ "out-game": { "value": OutGameStorage.upgradableFieldsValue, "level": OutGameStorage.upgradableFieldsLevel, @@ -13,7 +13,7 @@ static func serialize(): "tutorial-watched": StarterPanel.tutorialWatched, "selected-character": StarterPanel.selectedCharacter } - } + }) static func apply(saveData: Dictionary): OutGameStorage.upgradableFieldsValue = saveData["out-game"]["value"] OutGameStorage.upgradableFieldsLevel = saveData["out-game"]["level"] @@ -23,12 +23,12 @@ static func apply(saveData: Dictionary): static func load(): var origin = JsonTool.parseFromFile(SAVE_FILE) if origin is Dictionary: - origin["out-game"]["value"] = ArrayTool.mapEntries(origin["out-game"]["value"], func(key, value): return [int(key), value]) - origin["out-game"]["level"] = ArrayTool.mapEntries(origin["out-game"]["level"], func(key, value): return [int(key), value]) - origin["out-game"]["inventory"] = ArrayTool.mapEntries(origin["out-game"]["inventory"], func(key, value): return [int(key), value]) + JsonTool.restoreEnumKey(origin, "out-game.value") + JsonTool.restoreEnumKey(origin, "out-game.level") + JsonTool.restoreEnumKey(origin, "out-game.inventory") return origin static func save(): var file = FileAccess.open(SAVE_FILE, FileAccess.ModeFlags.WRITE) if file is FileAccess: - file.store_string(JsonTool.stringify(serialize())) + file.store_string(serialize()) file.close() diff --git a/scripts/Tools/JsonTool.gd b/scripts/Tools/JsonTool.gd index 0558d49..d45edc0 100644 --- a/scripts/Tools/JsonTool.gd +++ b/scripts/Tools/JsonTool.gd @@ -12,3 +12,5 @@ static func parseFromText(text: String): return jsonObj.data static func stringify(data: Variant): return JSON.stringify(data, " ") +static func restoreEnumKey(origin: Dictionary, classpath: String): + ArrayTool.setNested(origin, classpath, ArrayTool.mapEntries(ArrayTool.getNested(origin, classpath), func(key, value): return [int(key), value]))