CocosCreator简易开源框架SCL之本地化存储

本地化存储

单机游戏或者不是特别重要的游戏数据,我们往往选择将数据存储在本地,Cocos为我们提供了localStorage模块来操作。Cocos提供的localStorage在网页端的实现为localStorage,在原生上为Sqlite。本框架在该基础上做了一些优化,取名为SqlUtil。

改良原因

  1. 目前所有的浏览器中都会把localStorage的值类型限定为string类型
  2. 明文存储

主要是因为存储都为string类型,对我们对类型处理和json序列化需要重复操作,不太方便,这是我们主要改良点,第二点加密方案,仅是一种优化方案。

改良方式

对症下药,我们能否提前定义好类型,让数据返回时就处理好数据类型的问题呢?
所以,我们仅需对下面这个api做出处理就可以了

let data = sys.localStorage.getItem(key);

我们重新定义一个方法

get(key, type){
    let data = sys.localStorage.getItem(key);
    if(type is string) {
        return data;
    }
    if(type is number) {
        return data to number;
    }
    ...
}

这样,我们就达到要求了,同时我们可能希望没有这个值的时候,能够使用一个默认值,那么还可以传一个默认值进去

get(key, type, default){
    // ...
    if(null == data) {
        return default;
    }
    // ...
}

这样传递参数似乎有点多,我们考虑下,是否default也是一种数据类型,而且应该和我们期望的数据类型是一致的,所以修改下

get(key, default){
    type = getType(default);
    // ...
}

至此,我们的改良方案就结束了。

关于加密方案

我选取的是aes加密,所以安全系数一般,但是也可以防止那些直接伸手的了,还是可以的。当然,我们调试的时候,其实并不想加密,那么可以做个例外

set(){
    // ...
    if(!调试模式) {
        encrypt();
    }
    // ...
}

get(){
    // ...
    if(!调试模式) {
        decrypt();
    }
    // ...
}

继续优化

又到出题目时间了~

  1. 我们存储时,需要区分用户数据和系统数据,我们要清空所有用户数据,但不想清除系统数据,怎么做?
  2. 在原生上,存储和获取,会让游戏卡顿,如何优化?

系列文章

  1. CocosCreator简易开源框架SCL之白皮书
  2. CocosCreator开源框架SCL之弹框管理

该框架开发的小游戏:翻棋子游戏

代码已上传到git: github / 同步镜像gitee

  • 如需2.x版本,请看CCCLibs仓库该仓库并没有整理,请自行参考

有任何建议或者疑问,可以关注作者公众号
image

2赞

大佬 我想请问一下 在微信小游戏平台 背包怎么存储,例如 背包中有100类物品 只是改变了其中一种物品的数量 也要全部 格式化 一次存储吗?

点赞先!!!