HarmonyOS7应用《拼棋派对》实战:本地设置、战绩与关卡进度保存
成语通关解锁下一关,诗词收藏诗签,寻物重玩保留最快时间,这些成绩应当在离开页面后仍然存在。《拼棋派对》用本地Preferences保存设置、战绩和几类关卡进度。它没有账号或云端同步,页面内状态保留也不能等同于完整棋局持久化。
本篇核对1.0.19的 GameRecordStore.ets,结合本系列已经完成的关卡观察保存范围。演示使用本轮地图与结果截图;未把返回地图的检查称为杀进程恢复测试。
本文目录
先区分三种数据
第一类是偏好设置,例如音效开关、座位方向;第二类是长期成绩,例如战绩、星数、解锁关卡和诗签;第三类是当前对局的临时状态,例如象棋90点盘面或24点中间表达式。
GameLocalData保存前两类。ContinuationSnapshot只保存当前玩法、拼图配置、部分步数与时间等入口信息,并没有包含所有玩法的完整数组、历史和待执行动作。因此“本机接续”不能写成“所有棋局无损恢复”。
| 数据 | 当前保存方式 |
|---|---|
| 音效与座位 | 独立Preferences键 |
| 战绩列表 | 序列化数组 |
| 成语、诗词、寻物进度 | 各自模型序列化并归一化 |
| 接续入口与部分计数 | ContinuationSnapshot |
| 全部棋盘与撤销历史 | 不应由当前快照字段推断已保存 |
明确保存范围,比在界面上写一句“进度已保存”更重要。用户想知道关闭后还能继续什么,而不是存储API叫什么。
读取时归一化并提供默认值
loadGameLocalData用Promise.all读取多个键。关卡进度解析后分别调用normalize函数,确保解锁范围、数组长度和默认值满足当前版本需要。设置不存在时使用true或auto等默认值。
const values = await Promise.all([
pref.get(RECORDS_KEY, ''),
pref.get(BEST_SINGLE_STEPS_KEY, 0),
pref.get(BEST_SINGLE_TIME_KEY, 0),
pref.get(SOUND_ENABLED_KEY, true)
]);
这是实际读取列表的前四项节选。默认值描述新用户,也为缺少旧字段的版本提供回退。对象解析与归一化不能省略:磁盘上的字符串不一定具有当前接口要求的字段与有效数值。
当前外围catch返回整套默认数据。它能避免直接崩溃,但也可能掩盖某一个键损坏导致其他有效数据一起回退。若希望更细致恢复,可以按数据项分别处理,并保留可诊断的错误信息。
写入完成后flush
saveGameLocalData依次put设置、战绩、进度和接续快照,最后await pref.flush。对象和数组先JSON.stringify,基本数值和布尔值直接写入。
await pref.put(IDIOM_PROGRESS_KEY, JSON.stringify(data.idiomProgress));
await pref.put(POETRY_PROGRESS_KEY, JSON.stringify(data.poetryProgress));
await pref.put(HIDDEN_OBJECT_PROGRESS_KEY, JSON.stringify(data.hiddenObjectProgress));
await pref.put(SEAT_ORIENTATION_KEY, data.seatOrientation);
await pref.flush();
put与flush不是一回事,界面改了也不等于磁盘已完成持久化。需要在关键信息保存后正确等待,而不是关机前只发起一个没有等待的异步调用。
当前函数catch为空,没有把失败传给调用方。这样保存异常可能被静默吞掉,文章不能宣称已经有可靠的失败重试。更完善的做法是返回可观察结果、记录必要日志,再由产品决定提示或重试,避免每次点击都重复弹窗。
连续保存还有先后顺序问题。如果多个异步快照交错写入,旧数据可能晚于新数据落盘。后续可用串行保存队列或版本号处理,这属于改进方案,尚未在本轮接入。
战绩与最佳成绩的更新
createMatchRecord用时间与索引组合生成id,保存玩法、胜者、详情和时间。关卡进度则保留最高星数、最高得分或最短用时,而不是覆盖成最近一次成绩。
寻物本轮40秒完成,第1关此前最好11秒,因此地图仍显示11秒;成语完成首关后地图显示3星和最高关卡2;诗词八题后显示1/96通关和8张诗签。这些现象分别对应最佳值、解锁和收藏状态。
独立组件通过回调交给父页面保存。组件只知道进度改变,不需要持有主页面的存储对象。复用元服务时也更容易替换保存适配层。
效果与可靠性边界
这组图展示本轮已发生的结果与返回地图。不同玩法按段展示,没有把它拼成一次连续点击。正常保存的完整验收还应包含:等待flush、关闭进程、重新启动、读取对应设置和进度,再核对内容。
同时应覆盖没有旧键、损坏JSON、保存失败、重复战绩、快速切换设置和版本新增字段。本轮不修改或清空用户数据来制造这些异常,相关边界保留为后续测试。
应用重装、清除数据和更换设备可能失去本机记录。当前没有账号与云服务,就应在说明中保持这个范围。接续字段的存在,也不代表实现跨设备流转。
源码入口:services/GameRecordStore.ets,以及主页面保存调用与各进度normalize函数。参考HarmonyOS官方文档。下一篇说明怎样把已有规则与页面复用到手机元服务。
更多推荐
所有评论(0)