跳到主要内容

存档管理器(SaveManager)

相关源文件

目的与范围

SaveManager 是 Adventure-King 中负责管理持久化游戏状态的单例。它处理玩家进度、装备、关卡状态与设置项的存取,并支持 5 个存档槽位。系统使用双存储方案(SQLite + JSON 备份),并提供运行时缓存层以支持无缝场景切换。

关于使用 SaveManager 的导出/导入 hooks 的云同步服务,请参见 CloudSyncService。关于 SaveManager 存储的数据结构,请参见 Save Data Structures。关于底层存储实现细节,请参见 Storage Layer

来源Classes/Save/SaveManager.h L1-L335

Classes/Save/SaveManager.cpp L1-L80

[图 5:存档/读档数据流架构]


系统架构

SaveManager 实现单例模式,作为游戏的持久化中心枢纽。它连接玩法系统(PlayerCharacter、GameScene、LevelMap)与多个存储后端。

SaveManager 类结构

来源:Adventure-King/Classes/Save/SaveManager.h L20-L334

Adventure-King/Classes/Save/SaveManager.cpp L28-L80


文件路径与 Key 参考

目录结构

{WritablePath}/
├── saves/
│ ├── adventure_king_save.db (localStorage SQLite database)
│ ├── save_0.json (Slot 0 backup)
│ ├── save_1.json (Slot 1 backup)
│ ├── save_2.json (Slot 2 backup)
│ ├── save_3.json (Slot 3 backup)
│ └── save_4.json (Slot 4 backup)
└── settings.json (Settings backup)

存储 Key 生成

buildStorageKey(suffix) 函数位于 Classes/Save/SaveManager.cpp L22-L25

,通过在 suffix 前拼接 "ak_" 来构造 key:

  • 槽位 key:getSaveStorageKey(i)"ak_save_slot_" + std::to_string(i)
  • 设置 key:getSettingsStorageKey()"ak_settings"

路径生成

  • 存档文件:getSaveFilePath(i){WritablePath}/saves/save_{i}.json
  • 设置文件:getSettingsFilePath(){WritablePath}/settings.json

来源Classes/Save/SaveManager.cpp L16-L26

Classes/Save/SaveManager.cpp L193-L257


与游戏系统的集成

GameScene 集成

GameScene 是 SaveManager 的主要使用方:

GameScene 职责使用的 SaveManager 方法
手动存档(暂停菜单)saveGame(slot, player, fillProgressDataForSave())
自动存档计时器每次 update 调用 tickAutoSave(dt)
立即存档请求consumeImmediateSaveRequest(reason)
加载游戏状态applyPlayerData(player, getRuntimePlayerData())
恢复世界状态getRuntimeProgressData() 应用到 LevelMap
场景切换离开前调用 cacheRuntimePlayerData(player)

来源Adventure-King/Classes/Scenes/GameScene.cpp L937-L1011

LevelMap 集成

LevelMap 通过 SaveManager 导出/导入世界状态:

LevelMap 数据导出方法导入方法
敌人生成点exportEnemySpawnPointStates()applyEnemySpawnPointStates(states)
竞技场进度exportArenaStates()applyArenaStates(states)
关卡清理标记存入 GameProgressSaveData::isLevelClearedrestoreLevelClearedForLoad(bool)

这些方法会在存档时由 GameScene 的 fillProgressDataForSave() 调用;读档初始化时亦会调用。

来源Classes/Scenes/LevelMap.cpp L690-L864

Classes/Scenes/LevelMap.h L94-L149

HelloWorldScene 集成

主菜单会使用 SaveManager 来:

  • 通过 getAllSaveSlotInfos() 列出全部槽位供存档菜单 UI 使用
  • 加载选中的存档并写入运行时缓存,供 LoadingScene 消费
  • 开始新游戏或加载旧存档时绑定活跃槽位

来源Classes/Scenes/HelloWorldScene.cpp L463-L637

Classes/Scenes/Layers/SaveMenuLayer.cpp L192-L557


来源Classes/Save/SaveManager.h L1-L335

Classes/Save/SaveManager.cpp L1-L1103

Classes/Save/SaveData.h L1-L199

Classes/Save/JsonSerializer.cpp L1-L600

Classes/Scenes/Layers/SaveMenuLayer.cpp L1-L770

Classes/Scenes/HelloWorldScene.cpp L1-L952

Classes/Scenes/LevelMap.cpp L1-L1200